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

题目链接

中文题意,与上题类似。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <queue>
 5 #include <cstdlib>
 6 #include <algorithm>
 7 const int maxn = 200000+10;
 8 using namespace std;
 9 int a[maxn], n, m;
10 struct line
11 {
12     int l, r, val;  //val代表该区间的最大值
13 }tr[4*maxn];
14 
15 void build(int o, int l, int r)
16 {
17     tr[o].l = l; tr[o].r = r;
18     if(l==r)
19     {
20         tr[o].val = a[l];
21         return;
22     }
23     int mid = (l+r)/2;
24     build(2*o, l, mid);
25     build(2*o+1, mid+1, r);
26     tr[o].val = max(tr[2*o].val, tr[2*o+1].val);
27 }
28 int query(int o, int l, int r)
29 {
30     if(tr[o].l==l && tr[o].r==r)
31         return tr[o].val;
32     int mid = (tr[o].l+tr[o].r)/2;
33     if(r<=mid) query(2*o, l, r);  //这里一定记住只要不跨区间就是l,r。因为这个错了几次
34     else if(l > mid) query(2*o+1, l, r);
35     else
36     {
37         return max(query(2*o, l, mid), query(2*o+1, mid+1, r));
38     }
39 }
40 void update(int o, int p, int v)
41 {
42     if(tr[o].l==tr[o].r && tr[o].l==p)
43     {
44         tr[o].val = v;
45         return;
46     }
47     int mid = (tr[o].l + tr[o].r)/2;
48     if(p<=mid) update(2*o, p, v);
49     else update(2*o+1, p, v);
50     tr[o].val = max(tr[2*o].val, tr[2*o+1].val);
51 }
52 int main()
53 {
54     char ch;
55     int i, l, r;
56     while(~scanf("%d%d", &n, &m))
57     {
58         for(i = 1; i <= n; i++)
59         scanf("%d", &a[i]);
60         build(1, 1, n);
61 
62         for(i = 0; i < m; i++)
63         {
64             getchar();
65             scanf("%c%d%d", &ch, &l, &r);
66             if(ch=='Q')
67                printf("%d
", query(1, l, r));
68             else
69                update(1, l, r);
70         }
71     }
72     return 0;
73 }
原文地址:https://www.cnblogs.com/bfshm/p/3890951.html