hdu1754 I Hate It

http://acm.hdu.edu.cn/showproblem.php?pid=1754

线段树,单点更新

 1 #include <stdio.h>
 2 
 3 #define lson l, m, root<<1
 4 #define rson m+1, r, root<<1|1
 5 
 6 const int maxn = 200010;
 7 const int minint = 1<<31;
 8 int max1[maxn<<2];
 9 
10 int max(int x, int y)
11 {
12     return x>y? x: y;
13 }
14 
15 void push_up(int root)
16 {
17     max1[root] = max(max1[root<<1], max1[root<<1|1]);
18 }
19 
20 void build(int l, int r, int root)
21 {
22     int m;
23     if(l == r)
24     {
25         scanf("%d", max1+root);
26         return;
27     }
28     m = (l + r) >> 1;
29     build(lson);
30     build(rson);
31     push_up(root);
32 }
33 
34 void update(int x, int change, int l, int r, int root)
35 {
36     int m;
37     if(l == r)
38     {
39         max1[root] = change;
40         return;
41     }
42     m = (l + r) >> 1;
43     if(x <= m)
44     {
45         update(x, change, lson);
46     }
47     if(m+1 <= x)
48     {
49         update(x, change, rson);
50     }
51     push_up(root);
52 }
53 
54 int query(int L, int R, int l, int r, int root)
55 {
56     int m, result;
57     if(L <= l && r <= R)
58     {
59         return max1[root];
60     }
61     result = minint;
62     m = (l + r) >> 1;
63     if(L <= m)
64     {
65         result = max(result, query(L, R, lson));
66     }
67     if(m+1 <= R)
68     {
69         result = max(result, query(L, R, rson));
70     }
71     return result;
72 }
73 
74 int main()
75 {
76     int n, m, a, b;
77     char c;
78     while(~scanf("%d%d", &n, &m))
79     {
80         build(1, n, 1);
81         getchar();
82         while(m-- && scanf("%c%d%d%*c", &c, &a, &b))
83         {
84             if(c == 'Q')
85             {
86                 printf("%d\n", query(a, b, 1, n, 1));
87                 continue;
88             }
89             update(a, b, 1, n, 1);
90         }
91     }
92     return 0;
93 }
原文地址:https://www.cnblogs.com/yuan1991/p/hdu1754.html