#include<stdio.h>
#include<math.h>
int tree[200005],tree2[200005],c[50005];
int MAX(int a,int b){return a>b?a:b;}
int MIN(int a,int b){return a<b?a:b;}
void init(int l,int r,int pos)
{
int mid=(l+r)/2;
if(l==r){ tree[pos]=c[l]; return;}
init(l,mid,2*pos);
init(mid+1,r,2*pos+1);
tree[pos]=MAX(tree[2*pos],tree[2*pos+1]);
}
void init2(int l,int r,int pos)
{
int mid=(l+r)/2;
if(l==r){ tree2[pos]=c[l]; return;}
init2(l,mid,2*pos);
init2(mid+1,r,2*pos+1);
tree2[pos]=MIN(tree2[2*pos],tree2[2*pos+1]);
}
int ques(int l,int r,int pos,int templ,int tempr)
{
int mid=(l+r)/2;
if(templ<=l&&r<=tempr) return tree[pos];
if(templ>mid) return ques(mid+1,r,2*pos+1,templ,tempr);
else if(tempr<=mid) return ques(l,mid,2*pos,templ,tempr);
else return MAX(ques(mid+1,r,2*pos+1,mid+1,tempr),ques(l,mid,2*pos,templ,mid));
}
int ques2(int l,int r,int pos,int templ,int tempr)
{
int mid=(l+r)/2;
if(templ<=l&&r<=tempr) return tree2[pos];
if(templ>mid) return ques2(mid+1,r,2*pos+1,templ,tempr);
else if(tempr<=mid) return ques2(l,mid,2*pos,templ,tempr);
else return MIN(ques2(mid+1,r,2*pos+1,mid+1,tempr),ques2(l,mid,2*pos,templ,mid));
}
int main()
{
int n,q,i,x,y;
while(scanf("%d%d",&n,&q)>0)
{
for(i=1;i<=n;i++) scanf("%d",c+i);
init(1,n,1);
init2(1,n,1);
for(i=0;i<q;i++)
{
scanf("%d%d",&x,&y);
printf("%d\n",ques(1,n,1,x,y)-ques2(1,n,1,x,y));
}
}
return 0;
}
poj3264
最新推荐文章于 2021-08-08 10:34:20 发布