POJ 3264 线段树 基础入门

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\n",_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 }
View Code


线段树学习http://www.notonlysuccess.com/index.php/segment-tree-complete/

posted @ 2014-03-15 14:54  Cshhr  阅读(305)  评论(0编辑  收藏  举报