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 }