Advertisement
a53

maxq

a53
Dec 4th, 2021
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.02 KB | None | 0 0
  1. #include <cstdio>
  2. #include <algorithm>
  3. using namespace std;
  4.  
  5. #define FIN "maxq.in"
  6. #define FOUT "maxq.out"
  7.  
  8. #define MAX_N (1<<18)
  9. #define max(a, b) ((a) > (b) ? (a) : (b))
  10.  
  11. int N, M;
  12. int v[MAX_N];
  13. long long A[MAX_N<<1], B[MAX_N<<1], C[MAX_N<<1], Sum[MAX_N<<1];
  14.  
  15. #define lf (n<<1)
  16. #define rt (lf+1)
  17. #define md ((l+r)>>1)
  18.  
  19. void build(int n, int l, int r) {
  20. if (l == r) {
  21. A[n] = B[n] = C[n] = max(v[l], 0);
  22. Sum[n] = v[l];
  23. } else {
  24. build(lf, l, md);
  25. build(rt, md+1, r);
  26. A[n] = max(A[lf], Sum[lf]+A[rt]);
  27. B[n] = max(B[lf]+Sum[rt], B[rt]);
  28. C[n] = max(max(C[lf], C[rt]), B[lf]+A[rt]);
  29. Sum[n] = Sum[lf]+Sum[rt];
  30. }
  31. }
  32.  
  33. int p, x;
  34.  
  35. void update(int n, int l, int r) // p, x
  36. {
  37. if (l == r) {
  38. A[n] = B[n] = C[n] = max(x, 0);
  39. Sum[n] = x;
  40. } else {
  41. if (p <= md) update(lf, l, md);
  42. else update(rt, md+1, r);
  43.  
  44. A[n] = max(A[lf], Sum[lf]+A[rt]);
  45. B[n] = max(B[lf]+Sum[rt], B[rt]);
  46. C[n] = max(max(C[lf], C[rt]), B[lf]+A[rt]);
  47.  
  48. Sum[n] = Sum[lf]+Sum[rt];
  49. }
  50. }
  51.  
  52. int a, b;
  53. long long ans, S;
  54.  
  55. void query(int n, int l, int r) // a, b
  56. {
  57. if (a <= l && r <= b) {
  58. if (S < 0) S = 0;
  59. ans = max(ans, max(S+A[n], C[n]));
  60. S = max(S+Sum[n], B[n]);
  61. } else {
  62. if (a <= md) query(lf, l, md);
  63. if (b > md) query(rt, md+1, r);
  64. }
  65. }
  66.  
  67. int main()
  68. {
  69. int i, t, v1, v2;
  70.  
  71. freopen(FIN, "r", stdin);
  72. freopen(FOUT, "w", stdout);
  73.  
  74. scanf("%d", &N);
  75. for (i = 1; i <= N; ++i)
  76. scanf("%d", v+i);
  77. build(1, 1, N);
  78. scanf("%d", &M);
  79. while (M--) {
  80. scanf("%d %d %d", &t, &v1, &v2);
  81. if (t == 0) { // update
  82. p = v1+1;
  83. x = v2;
  84. update(1, 1, N);
  85. } else { // query
  86. S = ans = 0;
  87. a = v1+1;
  88. b = v2+1;
  89. query(1, 1, N);
  90.  
  91. printf("%lld\n", ans);
  92. }
  93. }
  94. return 0;
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement