【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 }

你可能感兴趣的:(poj)