HDU (线段树 单点更新) I Hate It

和上一道题没什么变化,只不过把单点增减变成了单点替换,把区间求和变成了区间求最大值。

 1 #include <cstdio>
 2 #include <algorithm>
 3 using namespace std;
 4 
 5 const int maxn = (1 << 20);
 6 
 7 int n, m, qL, qR, p, v;
 8 int _max[maxn];
 9 
10 void build(int o, int L, int R)
11 {
12     if(L == R) { scanf("%d", &_max[o]); return; }
13     int M = (L + R) / 2;
14     build(o*2, L, M);
15     build(o*2+1, M+1, R);
16     _max[o] = max(_max[o*2], _max[o*2+1]);
17 }
18 
19 void update(int o, int L, int R)
20 {
21     if(L == R) { _max[o] = v; return; }
22     int M = (L + R) / 2;
23     if(p <= M) update(o*2, L, M);
24     else update(o*2+1, M+1, R);
25     _max[o] = max(_max[o*2], _max[o*2+1]);
26 }
27 
28 int query(int o, int L, int R)
29 {
30     if(qL <= L && qR >= R) return _max[o];
31     int ans = -1;
32     int M = (L + R) / 2;
33     if(qL <= M) ans = max(ans, query(o*2, L, M));
34     if(qR > M) ans = max(ans, query(o*2+1, M+1, R));
35     return ans;
36 }
37 
38 char op[10];
39 
40 int main()
41 {
42     //freopen("in.txt", "r", stdin);
43 
44     while(scanf("%d%d", &n, &m) == 2)
45     {
46         build(1, 1, n);
47 
48         while(m--)
49         {
50             scanf("%s", op);
51             if(op[0] == 'Q')
52             {
53                 scanf("%d%d", &qL, &qR);
54                 printf("%d\n", query(1, 1, n));
55             }
56             else
57             {
58                 scanf("%d%d", &p, &v);
59                 update(1, 1, n);
60             }
61         }
62     }
63 
64     return 0;
65 }
代码君

 

posted @ 2015-04-25 18:16  AOQNRMGYXLMV  阅读(133)  评论(0编辑  收藏  举报