Advertisement
_rashed

SPOJ GSS3

Feb 24th, 2022
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.06 KB | None | 0 0
  1. #define ll long long
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4.  
  5. const int OO = 1e9;
  6. const double EPS = 1e-9;
  7.  
  8. struct Node {
  9.     ll sum;
  10.     ll prefix;
  11.     ll suffix;
  12.     ll ans;
  13. };
  14.  
  15. Node combine(Node l, Node r) {
  16.     Node ret;
  17.     ret.sum = l.sum + r.sum;
  18.     ret.prefix = max(l.prefix,l.sum+r.prefix);
  19.     ret.suffix = max(r.suffix,r.sum+l.suffix);
  20.     ret.ans = max(ret.sum,max(ret.prefix,max(ret.suffix,max(l.ans,max(r.ans,l.suffix+r.prefix)))));
  21.     return ret;
  22. }
  23.  
  24. ll arr[50001];
  25. Node tree[4*50001];
  26. int n;
  27.  
  28. void build(int l = 1, int r = n, int p = 1) {
  29.     if(l == r) {
  30.         tree[p].sum = tree[p].prefix = tree[p].suffix = tree[p].ans =  arr[l];
  31.     }
  32.     else {
  33.         int mid = (l+r)/2;
  34.         build(l,mid,p*2);
  35.         build(mid+1,r,p*2+1);
  36.         tree[p] = combine(tree[p*2],tree[p*2+1]);
  37.     }
  38. }
  39.  
  40. Node query(int ql, int qr,int l = 1, int r = n, int p = 1) {
  41.     if(l >= ql && r <= qr) {
  42.         return tree[p];
  43.     }
  44.     int mid = (l+r)/2;
  45.     if(ql <= mid && qr >= mid+1)
  46.         return combine(query(ql,min(qr,mid),l,mid,p*2),query(max(ql,mid+1),qr,mid+1,r,p*2+1));
  47.     if(ql <= mid)
  48.         return query(ql,qr,l,mid,p*2);
  49.     return query(ql,qr,mid+1,r,p*2+1);
  50. }
  51.  
  52. void update(int qt, ll v, int l = 1, int r = n, int p = 1) {
  53.     if(l == r) {
  54.         arr[l] = v;
  55.         tree[p].sum = tree[p].prefix = tree[p].suffix = tree[p].ans =  arr[l];
  56.     }
  57.     else {
  58.         int mid = (l+r)/2;
  59.         if(qt <= mid) {
  60.             update(qt,v,l,mid,p*2);
  61.         }
  62.         else {
  63.             update(qt,v,mid+1,r,p*2+1);
  64.         }
  65.         tree[p] = combine(tree[p*2],tree[p*2+1]);
  66.     }
  67. }
  68.  
  69. int main()
  70. {
  71.     ios_base::sync_with_stdio(false);
  72.     cin.tie(NULL);
  73.     cout.tie(NULL);
  74.     cin >> n;
  75.     for(int i = 1; i <= n; i++) {
  76.         cin >> arr[i];
  77.     }
  78.     build();
  79.     int q;
  80.     cin >> q;
  81.     while(q--) {
  82.         int t,x,y;
  83.         cin >> t >> x >> y;
  84.         if(t) {
  85.             cout << query(x,y).ans << "\n";
  86.         }
  87.         else {
  88.             update(x,y);
  89.         }
  90.     }
  91.     return 0;
  92. }
  93.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement