rmq模板

来源:互联网 发布:会计电算化软件用友 编辑:程序博客网 时间:2024/06/17 23:50

来自kuangbin模板

#include <bits/stdc++.h>  #define N 1010  #define mem(a,x) memset(a,x,sizeof a)  using namespace std;  #define INF 0x3f3f3f3f  const double eps = 1e-8;  typedef long long ll;  const int MAXN = 50010;  int dpmin[MAXN][20];  int dpmax[MAXN][20];  int mm[MAXN];  int mi[MAXN];  void initRMQ(int n,int b[]){      mm[0] = -1;      for(int i=1;i<=n;i++){          mm[i] = ((i&(i-1))== 0 )? mm[i-1]+1: mm[i-1];          dpmin[i][0] = dpmax[i][0] = b[i];      }      for(int j=1;j<=mm[n];j++)          for(int i=1;i+(1<<j)-1 <=n;i++){              dpmax[i][j] = max(dpmax[i][j-1] , dpmax[i+(1<<(j-1))][j-1]);              dpmin[i][j] = min(dpmin[i][j-1] , dpmin[i+(1<<(j-1))][j-1]);          }    }  int rmqmax(int x,int y){      int k = mm[y-x+1];      return max(dpmax[x][k], dpmax[y-(1<<k)+1][k]);  }  int rmqmin(int x,int y){      int k = mm[y-x+1];      return min(dpmin[x][k], dpmin[y-(1<<k)+1][k]);  }  int arr[MAXN];  int main(){      int n;      int t;scanf("%d",&t);      while(t--){          scanf("%d",&n);          for(int i=1;i<=n;i++) scanf("%d",&arr[i]);          initRMQ(n,arr);          int q;scanf("%d",&q);          while(q--){              int a,b,c;scanf("%d%d%d",&c,&a,&b);              if(c == 1)                  printf("%d\n",rmqmin(a,b));              else if(c == 2)                  printf("%d\n",rmqmax(a,b));              else                   printf("%d\n",rmqmax(a,b)+rmqmin(a,b));          }      }        return 0;  }  


原创粉丝点击