RMQ模板题

 1 #include<cstdio>
 2 #include<cstring>
 3 using namespace std;
 4 const int N=50001,M=30;
 5 int n,q,h[N],minl[N][M],maxl[N][M];
 6 int RMQ(int,int),min(int,int),max(int,int);
 7 int main(){
 8     int l,r,tmp;
 9     scanf("%d %d",&n,&q);
10     for (int i=1;i<=n;i++){
11         scanf("%d",&tmp);
12         minl[i][0]=maxl[i][0]=tmp;
13     }
14     for (int j=1;j<=20;j++)
15         for (int i=1;i<=n;i++)
16             if (i+(1<<j)-1<=n){
17             minl[i][j]=min(minl[i][j-1],minl[i+(1<<(j-1))][j-1]);
18             maxl[i][j]=max(maxl[i][j-1],maxl[i+(1<<(j-1))][j-1]);
19         }
20     for (int i=1;i<=q;i++){
21         scanf("%d %d",&l,&r);
22         printf("%d\n",RMQ(l,r));
23     }
24     return 0;
25 }
26 int min(int x,int y){
27     return x<y?x:y;
28 }
29 int max(int x,int y){
30     return x>y?x:y;
31 }
32 int RMQ(int l,int r){
33     int k=0;
34     while ((1<<(k+1)) <=r-l+1) k++;
35     return max(maxl[l][k],maxl[r-(1<<k)+1][k])-min(minl[l][k],minl[r-(1<<k)+1][k]);
36 }
STD

 

posted on 2016-08-31 21:58  Absolutezero  阅读(194)  评论(0)    收藏  举报