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 }
浙公网安备 33010602011771号