求区间最大最小值差.
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=5e5+10;
#define inf 0x3f3f3f3f
#define lid (id<<1)
#define rid (id<<1|1)
int a[maxn];
struct node
{
int l,r,Max,Min;
}tr[maxn*4];
void push_up(int id)
{
tr[id].Max=max(tr[lid].Max,tr[rid].Max);
tr[id].Min=min(tr[lid].Min,tr[rid].Min);
}
void build(int id,int l,int r)
{
tr[id].l=l,tr[id].r=r;
if(l==r) tr[id].Max=tr[id].Min=a[l];
else{
int mid=(l+r)>>1;
build(lid,l,mid);
build(rid,mid+1,r);
push_up(id);
}
}
int ans1,ans2;
void query(int id,int l,int r)
{
if(l==tr[id].l &&r==tr[id].r)
ans1=max(ans1,tr[id].Max),ans2=min(ans2,tr[id].Min);
else{
int mid=(tr[id].l+tr[id].r)>>1;
if(r<=mid) query(lid,l,r);
else if(l>mid) query(rid,l,r);
else
{
query(lid,l,mid);
query(rid,mid+1,r);
}
}
}
int main()
{
int n,q;
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
build(1,1,n);
for(int i=1;i<=q;i++)
{
int x,y;
scanf("%d%d",&x,&y);
ans1=-1,ans2=inf;
query(1,x,y);
// printf("%d %d\n",ans1,ans2);
printf("%d\n",ans1-ans2);
}
}