#include<stdio.h> #include<stdlib.h> #include<math.h> #include<string.h> #define MAX 200001 #define maxs(a,b)a>b?a:b #define mins(a,b)a<b?a:b int dp1[MAX][40],dp2[MAX][40],n,m,a[MAX]; void RMQ_init() { int i,j; for(i=1;i<=n;i++) { dp1[i][0]=a[i]; dp2[i][0]=a[i]; } /* for(j=1;(1<<j)<=n;j++) for(i=1;i+(1<<j)-1<=n;i++) { dp1[i][j]=maxs(dp1[i][j-1],dp1[i+(1<<(j-1))][j-1]); dp2[i][j]=mins(dp2[i][j-1],dp1[i+(1<<(j-1))][j-1]); } */ int end_j=log(n+0.0)/log(2.0); int end_i; for(int j=1;j<=end_j;j++){ end_i=n+1-(1<<j); for(int i=1;i<=end_i;i++){ dp1[i][j]=maxs(dp1[i][j-1],dp1[i+(1<<(j-1))][j-1]); dp2[i][j]=mins(dp2[i][j-1],dp2[i+(1<<(j-1))][j-1]); } } } int get_big_rmq(int a,int b) { int k=(int)(log((double)(b-a+1))/log(2.0)); return maxs(dp1[a][k],dp1[b-(1<<k)+1][k]); } int get_min_rmq(int a,int b) { int k=(int)(log((double)(b-a+1))/log(2.0)); return mins(dp2[a][k],dp2[b-(1<<k)+1][k]); } int main() { //freopen("in","r",stdin); int i,x,y; while(scanf("%d%d",&n,&m)!=EOF) { for(i=1;i<=n;i++) scanf("%d",&a[i]); RMQ_init(); for(i=0;i<m;i++) { scanf("%d%d",&x,&y); printf("%d\n",get_big_rmq(x,y)-get_min_rmq(x,y)); } } return 0; } |
Double click to view unformatted code.