每个节点保存区间的最大最小值
水题不解释╮(╯▽╰)╭
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define lson l , mid, dex<<1
#define rson mid+1, r, dex<<1|1
#define havemid int mid = (l+r)>>1
#define LL long long
using namespace std;
const int mx = 50010;
LL mmax[mx<<2];
LL minn[mx<<2];
void Push_up(int dex)
{
mmax[dex] = max(mmax[dex<<1] , mmax[dex<<1|1]);
minn[dex] = min(minn[dex<<1] , minn[dex<<1|1]);
}
void build(int l, int r, int dex)
{
if(l == r)
{
int tem;
scanf("%d",&tem);
mmax[dex] = minn[dex] = tem;
return;
}
havemid;
build(lson);
build(rson);
Push_up(dex);
}
void query(int L, int R, int l, int r, int dex, LL& mxx, LL& mnn)
{
if(L<=l && R>=r)
{
mxx = max(mxx , mmax[dex]);
mnn = min(mnn , minn[dex]);
return;
}
havemid;
if(L <= mid) query(L, R, lson, mxx, mnn);
if(R > mid) query(L, R, rson, mxx, mnn);
}
int main()
{
// freopen("3264.txt","r",stdin);
int n,q;
while(~scanf("%d %d",&n,&q))
{
build(1, n ,1);
for(int i=1; i<=q; i++)
{
int a,b;
scanf("%d %d",&a,&b);
LL mxx = -1,mnn = 1e18;
query(a, b, 1, n, 1, mxx, mnn);
printf("%I64d\n",mxx - mnn);
}
}
return 0;
}