rmq算法的模板题,同时求区间内的最大最小值
#include<iostream> #include<cmath> #include<cstdio> using namespace std; int a[500086]; int mx[500086][20],mi[500086][20]; void rmqinit(int n) { for(int i=1;i<=n;i++){ mi[i][0]=mx[i][0]=a[i]; } int m=log(1.0*n)/log(2.0); for(int j=1;j<=m;j++){ for(int i=n;i>=1;i--){ mx[i][j]=mx[i][j-1]; if(i+(1<<(j-1))<=n){ mx[i][j]=max(mx[i][j-1],mx[i+(1<<(j-1))][j-1]); } mi[i][j]=mi[i][j-1]; if(i+(1<<(j-1))<=n){ mi[i][j]=min(mi[i][j-1],mi[i+(1<<(j-1))][j-1]); } } } } int rmqmax(int l,int r) { int m=log(1.0*r-l+1)/log(2.0); return max(mx[l][m],mx[r-(1<<m)+1][m]); } int rmqmin(int l,int r) { int m=log(1.0*r-l+1)/log(2.0); return min(mi[l][m],mi[r-(1<<m)+1][m]); } int main() { int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } rmqinit(n); int l,r; for(int i=1;i<=m;i++){ scanf("%d%d",&l,&r); printf("%d ",rmqmax(l,r)-rmqmin(l,r)); } }