RMQ模板题,直接套模板即可
#include<bits/stdc++.h> using namespace std; const int MAX=50005; int maxn[MAX][20],minn[MAX][20],n,q; void RMQ() { for(int j=1;(1<<j)<=n;j++) { for(int i=1;i+(1<<j)-1<=n;i++) { maxn[i][j]=max(maxn[i][j-1],maxn[i+(1<<(j-1))][j-1]); minn[i][j]=min(minn[i][j-1],minn[i+(1<<(j-1))][j-1]); } } } int main() { scanf("%d%d",&n,&q); int a; for(int i=1;i<=n;i++) { scanf("%d",&a); maxn[i][0]=minn[i][0]=a; } RMQ(); int L,R; for(int i=1;i<=q;i++) { scanf("%d%d",&L,&R); int k=0; while((1<<(k+1))<R-L+1) k++;//int k=log(double(R-L+1))/log(2.0); printf("%d\n",max(maxn[L][k],maxn[R-(1<<k)+1][k])-min(minn[L][k],minn[R-(1<<k)+1][k])); } return 0; }