题解思路:线段树维护每段中的最大和最小值。
代码:
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<iostream>
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int mx = 5e4+10;
int n,m,MAX[mx<<2],MIN[mx<<2],num;
struct data{
int maxx,minn;
data(){}
data(int Ma,int Mi){ maxx = Ma, minn = Mi ; }
};
void build(int l,int r,int rt){
if(l==r){
scanf("%d",&num);
MAX[rt] = MIN[rt] = num;
return ;
}
int mid = (l+r)>>1;
build(lson);
build(rson);
MAX[rt] = max(MAX[rt<<1],MAX[rt<<1|1]);
MIN[rt] = min(MIN[rt<<1],MIN[rt<<1|1]);
}
data query(int L,int R,int l,int r,int rt){
if(L<=l&&R>=r) return data(MAX[rt],MIN[rt]);
int mid = (l+r)>>1;
data po[2]={{0,inf},{0,inf}};
if(L<=mid) po[0] = query(L,R,lson);
if(R>mid) po[1] = query(L,R,rson);
return data(max(po[0].maxx,po[1].maxx),min(po[0].minn,po[1].minn));
}
int main(){
while(~scanf("%d%d",&n,&m)){
build(1,n,1);
while(m--){
int x, y;
scanf("%d%d",&x,&y);
data ans = query(x,y,1,n,1);
printf("%d\n",ans.maxx-ans.minn);
}
}
return 0;
}