【SPOJ】1043 Can you answer these queries III

操作:

1,更新某个位置的值。

2,查询区间最大连续和。

更新位置然后PushUp。

查询同【SPOJ】1043 Can you answer these queries I

 1 #include<cstdio>
 2 #define MAX(a,b) ((a)>(b)?(a):(b))
 3 #define MAXN 50010
 4 #define oo 1000000000
 5 struct node {
 6     int left, right, sum, val;
 7     void Init() {
 8         sum = 0;
 9         left = right = val = -oo;
10     }
11 };
12 node tree[MAXN << 2];
13 inline void PushUp(int rt) {
14     tree[rt].left = MAX(tree[rt << 1].left,
15             tree[rt << 1].sum + tree[rt << 1 | 1].left);
16     tree[rt].right = MAX(tree[rt << 1 | 1].right,
17             tree[rt << 1 | 1].sum + tree[rt << 1].right);
18     tree[rt].sum = tree[rt << 1].sum + tree[rt << 1 | 1].sum;
19     tree[rt].val = MAX(tree[rt << 1].val, tree[rt << 1 | 1].val);
20     tree[rt].val = MAX(tree[rt].val,
21             tree[rt << 1].right + tree[rt << 1 | 1].left);
22 }
23 void Build(int L, int R, int rt) {
24     if (L == R) {
25         scanf("%d", &tree[rt].val);
26         tree[rt].left = tree[rt].right = tree[rt].sum = tree[rt].val;
27     } else {
28         int mid = (L + R) >> 1;
29         Build(L, mid, rt << 1);
30         Build(mid + 1, R, rt << 1 | 1);
31         PushUp(rt);
32     }
33 }
34 void Update(int x, int val, int L, int R, int rt) {
35     if (L == R)
36         tree[rt].left = tree[rt].right = tree[rt].sum = tree[rt].val = val;
37     else {
38         int mid = (L + R) >> 1;
39         if (x <= mid)
40             Update(x, val, L, mid, rt << 1);
41         else
42             Update(x, val, mid + 1, R, rt << 1 | 1);
43         PushUp(rt);
44     }
45 }
46 node Query(int x, int y, int L, int R, int rt) {
47     if (x <= L && R <= y)
48         return tree[rt];
49     int mid = (L + R) >> 1;
50     node a, b, res;
51     a.Init(), b.Init(), res.Init();
52     if (x <= mid)
53         a = Query(x, y, L, mid, rt << 1);
54     if (y > mid)
55         b = Query(x, y, mid + 1, R, rt << 1 | 1);
56     res.left = MAX(a.left, a.sum + b.left);
57     res.right = MAX(b.right, b.sum + a.right);
58     res.sum = a.sum + b.sum;
59     res.val = MAX(a.val, b.val);
60     res.val = MAX(res.val, a.right + b.left);
61     return res;
62 }
63 int main() {
64     int n, q, cmd, x, y;
65     while (~scanf("%d", &n)) {
66         Build(1, n, 1);
67         scanf("%d", &q);
68         while (q--) {
69             scanf("%d%d%d", &cmd, &x, &y);
70             if (cmd)
71                 printf("%d\n", Query(x, y, 1, n, 1).val);
72             else
73                 Update(x, y, 1, n, 1);
74         }
75     }
76     return 0;
77 }
原文地址:https://www.cnblogs.com/DrunBee/p/2661098.html