HDU 1754 I Hate It 线段树(单点更新,成段查询)

题目链接:

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

题解:

单点更新,成段查询。

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define lson o<<1
 6 #define rson (o<<1)|1
 7 #define M l+(r-l)/2
 8 using namespace std;
 9 
10 const int maxn = 2e5 + 10;
11 
12 int n, m;
13 int maxv[maxn<<2];
14 
15 void build(int o, int l, int r) {
16     if (l == r) {
17         scanf("%d", maxv + o);
18     }
19     else {
20         build(lson, l, M);
21         build(rson, M + 1, r);
22         maxv[o] = max(maxv[lson], maxv[rson]);
23     }
24 }
25 
26 int _po, _v;
27 void update(int o, int l, int r) {
28     if (l == r) {
29         maxv[o] = _v;
30     }
31     else {
32         if (_po <= M) update(lson, l, M);
33         else update(rson, M + 1, r);
34         maxv[o] = max(maxv[lson], maxv[rson]);
35     }
36 }
37 
38 int ql,qr;
39 int _max;
40 void query(int o, int l, int r) {
41     if (ql <= l&&r <= qr) {
42         //printf("(%d,%d):%d\n", l, r,maxv[o]);
43         _max = max(_max, maxv[o]);
44     }
45     else {
46         //printf("(%d,%d):%d\n", l, r, maxv[o]);
47         if (ql <= M) query(lson, l, M);
48         if (qr > M) query(rson, M + 1, r);
49     }
50 }
51 
52 int main() {
53     while (scanf("%d%d", &n, &m) == 2) {
54         build(1, 1, n);
55         char cmd[11];
56         while (m--) {
57             scanf("%s", cmd);
58             if (cmd[0] == 'Q') {
59                 _max = -1;
60                 scanf("%d%d", &ql,&qr);
61                 query(1, 1, n);
62                 printf("%d\n", _max);
63             }
64             else if (cmd[0] == 'U') {
65                 scanf("%d%d", &_po, &_v);
66                 update(1, 1, n);
67             }
68         }
69     }
70     return 0;
71 }

 

posted @ 2016-04-23 23:10  fenicnn  阅读(136)  评论(0编辑  收藏  举报