http://poj.org/problem?id=3264 #include<iostream> #include<cstdio> #include<cstring> #define N 50000 using namespace std; int a[N]; struct node { int l,r; int _max,_min; int getmid(){ return (l+r)>>1; } }p[N*4]; int Max(int x,int y) { if(x>y) return x; return y; } int Min(int x,int y) { if(x<y) return x; return y; } void SET(int id) { p[id]._max=Max(p[id<<1]._max,p[id<<1|1]._max); p[id]._min=Min(p[id<<1]._min,p[id<<1|1]._min); } void build(int l,int r,int id) { p[id].l=l; p[id].r=r; if(l==r) { p[id]._max=p[id]._min=a[l]; return; } int mid=(l+r)>>1; build(l,mid,id<<1); build(mid+1,r,id<<1|1); SET(id); } void query(int l,int r,int id,int &_max,int &_min) { if(p[id].l==l&&p[id].r==r) { _max=p[id]._max; _min=p[id]._min; return; } int mid=p[id].getmid(); if(r<=mid) query(l,r,id<<1,_max,_min); else if(l>mid) query(l,r,id<<1|1,_max,_min); else { query(l,mid,id<<1,_max,_min); int k1=_max,k2=_min; query(mid+1,r,id<<1|1,_max,_min); _max=Max(k1,_max); _min=Min(k2,_min); } } int main(void) { int n,m; while(scanf("%d%d",&n,&m)!=EOF) { for(int i=1;i<=n;i++) scanf("%d",&a[i]); build(1,n,1); while(m--) { int x,y; scanf("%d%d",&x,&y); int _max=0,_min=0; query(x,y,1,_max,_min); printf("%d/n",_max-_min); } } } 简单线段树