#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=50005;
int root[4*maxn];
int root1[4*maxn];
int a[maxn];
int max1,min1;
const int inf=1000005;
void build(int u,int l,int r)
{
if(l==r)
{
root[u]=a[l];
root1[u]=a[l];
return ;
}
int mid=(l+r)>>1;
build(2*u,l,mid);
build(2*u+1,mid+1,r);
root[u]=max(root[2*u],root[2*u+1]);
root1[u]=min(root1[2*u],root1[2*u+1]);
}
void query(int u,int l,int r,int tl,int tr)
{
if(l>=tl&&r<=tr)
{
max1=(max1>root[u]?max1:root[u]);
return;
}
int mid=(l+r)>>1;
if(tr<=mid)query(2*u,l,mid,tl,tr);
else if(tl>mid)query(2*u+1,mid+1,r,tl,tr);
else
{
query(2*u,l,mid,tl,mid);
query(2*u+1,mid+1,r,mid+1,tr);
}
}
void query1(int u,int l,int r,int tl,int tr)
{
if(l>=tl&&r<=tr)
{
min1=(min1<root1[u]?min1:root1[u]);
return;
}
int mid=(l+r)>>1;
if(tr<=mid)query1(2*u,l,mid,tl,tr);
else if(tl>mid)query1(2*u+1,mid+1,r,tl,tr);
else
{
query1(2*u,l,mid,tl,mid);
query1(2*u+1,mid+1,r,mid+1,tr);
}
}
int main()
{
int n,q;
int i;
scanf("%d%d",&n,&q);
for(i=1; i<=n; i++)
scanf("%d",&a[i]);
build(1,1,n);
for(i=1; i<=q; i++)
{
int b,d;
scanf("%d%d",&b,&d);
max1=-inf;
min1=inf;
query(1,1,n,b,d);
query1(1,1,n,b,d);
//cout<<max1<<' '<<min1<<endl;
cout<<max1-min1<<endl;
}
return 0;
}
poj3264
最新推荐文章于 2021-07-25 12:09:13 发布