Advertisement
erek1e

SPOJ - GSS3

Jun 25th, 2023
865
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.50 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4.  
  5. using namespace std;
  6.  
  7. const long long INF = 1e9;
  8. struct Segment {
  9.     long long sum, maxPre, maxSuf, maxSum;
  10.     Segment operator + (const Segment &s2) const {
  11.         Segment s;
  12.         s.sum = sum + s2.sum;
  13.         s.maxPre = max(maxPre, sum + s2.maxPre);
  14.         s.maxSuf = max(s2.maxSuf, s2.sum + maxSuf);
  15.         s.maxSum = max({maxSum, s2.maxSum, maxSuf + s2.maxPre});
  16.         return s;
  17.     }
  18.     Segment () {
  19.         sum = 0;
  20.         maxSum = maxPre = maxSuf = -INF;
  21.     }
  22.     Segment (int x) {
  23.         maxSum = maxPre = maxSuf = sum = x;
  24.     }
  25. };
  26.  
  27. const int MX = 50000;
  28. int a[1+MX];
  29. Segment tree[1+4*MX];
  30. int n, m;
  31. void update(int i) {
  32.     tree[m+i] = Segment(a[i]);
  33.     for (i += m; i > 1; i >>= 1) {
  34.         int x = i, y = i^1;
  35.         if (x > y) swap(x, y);
  36.         tree[i>>1] = tree[x] + tree[y];
  37.     }
  38. }
  39. Segment query(int ql, int qr, int cur = 1, int l = 0, int r = m) {
  40.     if (qr <= l || r <= ql || cur >= m+n) return {};
  41.     if (ql <= l && r <= qr) return tree[cur];
  42.     return query(ql, qr, 2*cur, l, (l+r)/2) + query(ql, qr, 2*cur+1, (l+r)/2, r);
  43. }
  44.  
  45. int main() {
  46.     cin >> n;
  47.     for (m = 1; m < n; m <<= 1);
  48.     for (int i = 0; i < n; ++i) {
  49.         cin >> a[i];
  50.         update(i);
  51.     }
  52.     int q; cin >> q;
  53.     while (q--) {
  54.         int t, x, y;
  55.         cin >> t >> x >> y;
  56.         if (t == 0) a[x-1] = y, update(x-1);
  57.         else cout << query(x-1, y).maxSum << endl;
  58.     }
  59.     return 0;
  60. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement