【HDU1754】I Hate It(线段树)

update:单点替换 query:区间最值

 

 

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <cstdio>
 5 #include <numeric>
 6 #include <cctype>
 7 #include <algorithm>
 8 #include <cmath>
 9 #include <vector>
10 #include <climits>
11 using namespace std;
12 
13 const int maxn = 2e5 + 10;
14 int maxv[maxn * 3];
15 
16 void update (int p, int v, int o, int L, int R) {
17     int M = L + ((R - L) >> 1);
18     if (L == R) {
19         maxv[o] = v;
20     } else {
21         if (p <= M) {
22             update (p, v, o << 1, L, M);
23         } else {
24             update (p, v, (o << 1) | 1, M + 1, R);
25         }
26         maxv[o] = max (maxv[o * 2], maxv[o << 1 | 1]);
27     }
28 }
29 
30 int query (int ql, int qr, int o, int L, int R) {
31     int M = L + (R - L) / 2, ans = INT_MIN;
32     if (ql <= L && R <= qr) {
33         return maxv[o];
34     }
35     if (ql <= M) {
36         ans = max (ans, query (ql, qr, o << 1, L, M));
37     }
38     if (M < qr) {
39         ans = max (ans, query (ql, qr, o << 1 | 1, M + 1, R));
40     }
41     return ans;
42 }
43 
44 int main () {
45     int n, ask_n, x, a, b;
46     char op[5];
47     while (~scanf ("%d%d", &n, &ask_n)) {
48         memset (maxv, 0, sizeof(maxv));
49         for (int i = 1; i <= n; ++ i)  {
50             scanf ("%d", &x);
51             update (i, x, 1, 1, n);
52         }
53 
54         while (ask_n --) {
55             scanf ("%s %d %d", op, &a, &b);
56 
57             if (op[0] == 'Q') {
58                 printf ("%d\n", query (a, b, 1, 1, n));
59             } else if (op[0] == 'U') {
60                 update (a, b, 1, 1, n);
61             }
62         }
63     }
64     return 0;
65 }

 

posted @ 2014-07-29 15:32  Desgard_Duan  阅读(176)  评论(0编辑  收藏  举报