RMQ模板
RMQ的模板,应该还是比较清晰易懂的,ma[i][j]的意思是从i开始到后面的2^j-1位中最大的数字。
#include<iostream> #include<cstdio> #define maxn 50001 using namespace std; int ma[maxn][20],mi[maxn][20],n,m,a[maxn],l,r; void rmq() { for(int i=1;i<=n;i++) ma[i][0]=mi[i][0]=a[i]; for(int j=1;(1<<j)<=n;j++) for(int i=1;i+(1<<j)-1<=n;i++) { ma[i][j]=max(ma[i][j-1],ma[i+(1<<(j-1))][j-1]); mi[i][j]=min(mi[i][j-1],mi[i+(1<<(j-1))][j-1]); } } int sum(int l,int r) { int k=0,len=r-l+1; while((1<<(k))<=len) k++; k--; int maa,mii; maa=max(ma[l][k],ma[r-(1<<k)+1][k]);//很神奇 区间重复没有关系。。。 mii=min(mi[l][k],mi[r-(1<<k)+1][k]); return maa-mii; } main(){ cin>>n>>m; for(int i=1;i<=n;i++) cin>>a[i]; rmq(); for(int i=1;i<=m;i++) { cin>>l>>r; cout<<sum(l,r)<<endl; } }