https://vjudge.net/problem/POJ-3264
裸线段树
#include<iostream>
#include<stdio.h>
using namespace std;
typedef long long ll;
const int N=50000;
int A[N];
inline void read(int &x){char ch;bool ok;
for(ok=0,ch=getchar();!isdigit(ch);ch=getchar()) if(ch=='-') ok=1;
for(x=0;isdigit(ch);x=x*10+ch-'0',ch=getchar());if(ok) x=-x;}
struct SegmentTree{
int l,r,ma,mi;
#define l(x) Tree[x].l
#define r(x) Tree[x].r
#define ma(x) Tree[x].ma
#define mi(x) Tree[x].mi
}Tree[N*4+10];
//
void build(int p,int l,int r){
l(p)=l;r(p)=r;
if(l==r){
mi(p)=A[l];
ma(p)=A[l];
return;
}
int mid=(l+r)/2;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
mi(p)=min(mi(p*2),mi(p*2+1));
ma(p)=max(ma(p*2),ma(p*2+1));
}
int askma(int p,int l,int r){
if(l<=l(p)&&r>=r(p)){
return ma(p);
}
int mid=(l(p)+r(p))/2;
int val=0;
if(l<=mid) val=max(val,askma(p*2,l,r));
if(r>mid) val=max(val,askma(p*2+1,l,r));
return val;
}
int askmi(int p,int l,int r){
if(l<=l(p)&&r>=r(p)){
return mi(p);
}
int mid=(l(p)+r(p))/2;
int val=(1<<30);
if(l<=mid) val=min(val,askmi(p*2,l,r));
if(r>mid) val=min(val,askmi(p*2+1,l,r));
return val;
}
int main(){
int n,m,a,b;
read(n);
read(m);
for(int i=1;i<=n;++i){
read(A[i]);
}
build(1,1,n);
while(m--){
read(a),read(b);
printf("%d\n",askma(1,a,b)-askmi(1,a,b));
}
}