#include<stdio.h>
int a[200000];
struct node{
int maxx,minn;
}s[800000];
int max(int a,int b){
if(a>b)
return a;
return b;
}
int min(int a,int b){
if(a<b)
return a;
return b;
}
void build(int id,int l,int r){
if(l==r){
s[id].maxx=a[l];
s[id].minn=a[l];
// printf("%d %d\n",id,s[id].minn);
return;
}
int mid=(l+r)>>1;
build(id*2,l,mid);
build(id*2+1,mid+1,r);
s[id].maxx=max(s[id*2].maxx,s[id*2+1].maxx);
s[id].minn=min(s[id*2].minn,s[id*2+1].minn);
}
int QueryMax(int id,int ll,int rr,int l,int r){
if(l<=ll&&rr<=r){
// printf("%d %d %d %d\n",id,s[id].maxx,ll,rr);
return s[id].maxx;
}
int mid=(ll+rr)>>1;
if(r<=mid)
return QueryMax(id*2,ll,mid,l,r);
else if(l>mid)
return QueryMax(id*2+1,mid+1,rr,l,r);
else
return max(QueryMax(id*2,ll,mid,l,r),QueryMax(id*2+1,mid+1,rr,l,r));
}
int QueryMin(int id,int ll,int rr,int l,int r){
if(l<=ll&&rr<=r){
return s[id].minn;
}
int mid=(ll+rr)>>1;
if(r<=mid)
return QueryMin(id*2,ll,mid,l,r);
else if(l>mid)
return QueryMin(id*2+1,mid+1,rr,l,r);
else
return min(QueryMin(id*2,ll,mid,l,r),QueryMin(id*2+1,mid+1,rr,l,r));
}
int main(){
int n,m;
while(~scanf("%d%d",&n,&m)){
for(int i=1;i<=n;i++)
scanf("%d",a+i);
build(1,1,n);
while(m--){
int l,r;
scanf("%d%d",&l,&r);
printf("%d\n",QueryMax(1,1,n,l,r)-QueryMin(1,1,n,l,r));
}
return 0;
}
}
POJ - 3264 Balanced Lineup
最新推荐文章于 2020-07-08 13:14:40 发布