题意:n个数字,q个询问,问第A个到第B个数的极差。
思路:线段树,每个节点记录节点包括范围的最大值和最小值。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
struct node
{
int l,r;
int ma,mi;
}t[50005*4];
int n,q,a[50005],s,e;
int mma,mmi;
void create(int ll,int rr,int rot)
{
t[rot].l=ll;
t[rot].r=rr;
if(ll==rr)
{
t[rot].ma=a[ll];
t[rot].mi=a[ll];
}
else
{
int mid=(ll+rr)/2;
create(ll,mid,rot<<1);
create(mid+1,rr,rot<<1|1);
t[rot].ma=max(t[rot<<1].ma,t[rot<<1|1].ma);
t[rot].mi=min(t[rot<<1].mi,t[rot<<1|1].mi);
}
}
void query(int ll,int rr,int rot)
{
if(t[rot].l==ll&&t[rot].r==rr)
{
mma=max(mma,t[rot].ma);
mmi=min(mmi,t[rot].mi);
}
else
{
int mid=(t[rot].l+t[rot].r)/2;
if(rr<=mid)
{
query(ll,rr,rot<<1);
}
else if(ll>mid)
{
query(ll,rr,rot<<1|1);
}
else
{
query(ll,mid,rot<<1);
query(mid+1,rr,rot<<1|1);
}
}
}
int main()
{
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
create(1,n,1);
for(int i=0;i<q;i++)
{
scanf("%d%d",&s,&e);
mma=0;
mmi=1000001;
query(s,e,1);
cout<<mma-mmi<<endl;
}
return 0;
}