Problem: http://poj.org/problem?id=3264
求区间内最大值最小值的差
minv[]维护最小值
maxv[]维护最大值
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 5 #define lson l , m , rt<<1 6 #define rson m+1 , r , rt<<1|1 7 #define MAXN 50010 8 9 int minv[MAXN<<2],maxv[MAXN<<2]; 10 int n,q,_min,_max; 11 12 13 void pushup(int rt) 14 { 15 minv[rt] = min(minv[rt<<1] , minv[rt<<1|1]); 16 maxv[rt] = max(maxv[rt<<1] , maxv[rt<<1|1]); 17 } 18 19 20 void build(int l,int r,int rt) 21 { 22 if(l == r) 23 { 24 scanf("%d",&minv[rt]); 25 maxv[rt] = minv[rt]; 26 return ; 27 } 28 int m = (l+r) >> 1; 29 build(lson); 30 build(rson); 31 pushup(rt); 32 } 33 34 35 void query(int L,int R,int l,int r,int rt) 36 { 37 if(L<=l && r<=R) 38 { 39 _min = min(_min , minv[rt]); 40 _max = max(_max , maxv[rt]); 41 } 42 else 43 { 44 int m = (l+r) >> 1; 45 if(L <= m) query(L,R,lson); 46 if(R > m) query(L,R,rson); 47 } 48 } 49 50 51 void work() 52 { 53 int a,b; 54 for(int i=0 ; i<q ; i++) 55 { 56 scanf("%d%d",&a,&b); 57 _max = 0; 58 _min = 2e9; 59 query(a,b,1,n,1); 60 printf("%d ",_max-_min); 61 } 62 } 63 64 65 void init() 66 { 67 scanf("%d%d",&n,&q); 68 build(1,n,1); 69 } 70 71 72 int main() 73 { 74 init(); 75 work(); 76 return 0; 77 }
线段树学习: http://www.notonlysuccess.com/index.php/segment-tree-complete/