/* 询问一段区间内的元素差值最大是多少,用RMQ维护一个最大值和一个最小值,相减即可。 */ #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=50000+5; int h; int dpmax[maxn][18]; int dpmin[maxn][18]; int n,q; int k=0; int RMQ(int l,int r) { int k=0; while((1<<(k+1)<=(r-l+1))) k++; return max(dpmax[l][k],dpmax[r-(1<<k)+1][k])-min(dpmin[l][k],dpmin[r-(1<<k)+1][k]); } int main () { while(~scanf("%d%d",&n,&q)) { /* if(k) { memset(dpmax,0,sizeof(dpmax)); memset(dpmin,0,sizeof(dpmin)); } */ for(int i=0;i<n;i++) { scanf("%d",&h); dpmax[i][0]=h; dpmin[i][0]=h; } for(int k=1;(1<<k)<=n;k++) for(int i=0;i+(1<<k)-1<n;i++) { dpmax[i][k]=max(dpmax[i][k-1],dpmax[i+(1<<(k-1))][k-1]); dpmin[i][k]=min(dpmin[i][k-1],dpmin[i+(1<<(k-1))][k-1]); } int l,r; for(int i=0;i<q;i++) { scanf("%d%d",&l,&r); printf("%d\n",RMQ(l-1,r-1)); } k++; } return 0; }
来源:https://www.cnblogs.com/pealicx/p/6115587.html