G - Balanced Lineup
#include<iostream>
#include<stdio.h>
#include<cstdio>
using namespace std;
#define ll long long
#define inf 0x7f7f7f7f
const int maxn=500050;
struct node
{
ll l,r,minn,maxx;
ll mid()
{
return (l+r)/2;
}
} tree[maxn*4];
ll mi,ma,n,q,x,y;
void init(ll root,ll l,ll r)
{
tree[root].l=l;
tree[root].r=r;
if(l==r)
{
tree[root].maxx=-inf;
tree[root].minn=inf;
return ;
}
init(root*2,l,tree[root].mid());
init(root*2+1,tree[root].mid()+1,r);
tree[root].maxx=max(tree[root*2].maxx,tree[root*2+1].maxx);
tree[root].minn=min(tree[root*2].minn,tree[root*2+1].minn);
}
void updata(ll root,ll l,ll ad)
{
if(tree[root].l==l&&tree[root].r==l)
{
tree[root].maxx=tree[root].minn=ad;
return ;
}
if(l>tree[root].mid())
updata(root*2+1,l,ad);
else
updata(root*2,l,ad);
tree[root].maxx=max(tree[root*2].maxx,tree[root*2+1].maxx);
tree[root].minn=min(tree[root*2].minn,tree[root*2+1].minn);
}
void query(ll root,ll l,ll r)
{
if(tree[root].l==l&&tree[root].r==r)
{
mi=min(tree[root].minn,mi);
ma=max(tree[root].maxx,ma);
return ;
}
if(l>tree[root].mid())
query(root*2+1,l,r);
else if(r<=tree[root].mid())
query(root*2,l,r);
else
{
query(root*2,l,tree[root].mid());
query(root*2+1,tree[root].mid()+1,r);
}
}
int main()
{
while(~scanf("%lld%lld",&n,&q))
{
init(1,1,n);
for(int i=1; i<=n; i++)
{
scanf("%lld",&x);
updata(1,i,x);
}
while(q--)
{
ma=-inf;
mi=inf;
scanf("%lld%lld",&x,&y);
query(1,x,y);
printf("%lld\n",ma-mi);
}
}
return 0;
}