- #include <stdio.h>
- #include <string.h>
- #include <math.h>
- #define M 50010
- int mx[M][17],mi[M][17],d[M];
- int n,t;
- int min(int a,int b)
- {
- return a<b?a:b;
- }
- int max(int a,int b)
- {
- return a>b?a:b;
- }
- void init()
- {
- int i,j,m;
- for(i=1;i<=n;i++)
- mi[i][0]=mx[i][0]=d[i];
- m=(int)floor(log(1.0*n)/log(2.0));
- for(i=1;i<=m;i++)
- {
- for(j=n;j>=1;j--)
- {
- mx[j][i]=mx[j][i-1];
- if(j+(1<<(i-1))<=n)
- mx[j][i]=max(mx[j][i],mx[j+(1<<(i-1))][i-1]);
- mi[j][i]=mi[j][i-1];
- if(j+(1<<(i-1))<=n)
- mi[j][i]=min(mi[j][i],mi[j+(1<<(i-1))][i-1]);
- }
- }
- }
- int rmq_max(int l,int r)
- {
- int m=(int)floor(log(1.0*(r-l+1))/log(2.0));
- return max(mx[l][m],mx[r-(1<<m)+1][m]);
- }
- int rmq_min(int l,int r)
- {
- int m=(int)floor(log(1.0*(r-l+1))/log(2.0));
- return min(mi[l][m],mi[r-(1<<m)+1][m]);
- }
- int main()
- {
- int i,l,r;
- while(scanf("%d%d",&n,&t)!=EOF)
- {
- for(i=1;i<=n;i++)
- scanf("%d",&d[i]);
- init();
- while(t--)
- {
- scanf("%d%d",&l,&r);
- int ans=rmq_max(l,r)-rmq_min(l,r);
- printf("%d\n",ans);
- }
- }
- return 0;
- }
源博客地址:http://blog.csdn.net/yuan_lo/article/details/8744343