Advertisement
Hezov

MaxQ ONI XI 2007

Mar 24th, 2025
47
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.41 KB | None | 0 0
  1. #include <fstream>
  2. using namespace std;
  3. ifstream cin("maxq.in");
  4. ofstream cout("maxq.out");
  5. typedef long long ll;
  6. const ll mxN = 2e5;
  7. ll sol , suf;
  8. struct node{ll totalSum,bigSum, prefix, suffix;}A[4*mxN+1];
  9. void build(int node, int st, int dr)
  10. {
  11.     if(st == dr)
  12.     {
  13.         int x; cin >> x;
  14.         A[node] = {x,x,x,x};
  15.         return;
  16.     }
  17.     int mid = (st + dr) / 2;
  18.     build(2*node,st,mid);
  19.     build(2*node+1,mid+1,dr);
  20.  
  21.     A[node].totalSum = A[2*node].totalSum + A[2*node+1].totalSum;
  22.     A[node].prefix = max(A[2*node].prefix , A[2*node].totalSum + A[2*node+1].prefix);
  23.     A[node].suffix = max(A[2*node+1].suffix, A[2*node+1].totalSum + A[2*node].suffix);
  24.     A[node].bigSum = max(A[2*node].bigSum, A[2*node+1].bigSum);
  25.     A[node].bigSum = max(A[node].bigSum, A[2*node].suffix + A[2*node+1].prefix);
  26. }
  27. void update(int node,int st, int dr, int poz, int val)
  28. {
  29.     if(st == dr)
  30.     {
  31.         A[node] = {val,val,val,val};
  32.         return;
  33.     }
  34.     int mid = (st + dr) / 2;
  35.     if(poz <= mid)
  36.         update(2*node,st,mid,poz,val);
  37.     if(poz > mid)
  38.         update(2*node+1,mid+1,dr,poz,val);
  39.     A[node].totalSum = A[2*node].totalSum + A[2*node+1].totalSum;
  40.     A[node].prefix = max(A[2*node].prefix , A[2*node].totalSum + A[2*node+1].prefix);
  41.     A[node].suffix = max(A[2*node+1].suffix, A[2*node+1].totalSum + A[2*node].suffix);
  42.     A[node].bigSum = max(A[2*node].bigSum, A[2*node+1].bigSum);
  43.     A[node].bigSum = max(A[node].bigSum, A[2*node].suffix + A[2*node+1].prefix);
  44. }
  45. void query(int node, int st, int dr, int a, int b)
  46. {
  47.     if(a <= st && dr <= b)
  48.     {
  49.         sol = max(sol, A[node].bigSum);
  50.         sol = max(sol,suf + A[node].prefix);
  51.         suf = max(A[node].suffix, A[node].totalSum + suf);
  52.         return;
  53.     }
  54.     int mid = (st + dr) / 2;
  55.     if(a <= mid)
  56.         query(2*node,st,mid,a,b);
  57.     if(b > mid)
  58.         query(2*node+1,mid+1,dr,a,b);
  59. }
  60. int main()
  61. {
  62.     ios_base::sync_with_stdio(false);
  63.     cin.tie(0); cout.tie(0);
  64.     int n;
  65.     cin >> n;
  66.     build(1,1,n);
  67.     int m;
  68.     cin >> m;
  69.     for(int i = 1;i<=m;i++)
  70.     {
  71.         int op, a, b;
  72.         cin >> op >> a >> b;
  73.         if(op == 0)
  74.         {
  75.             a++;
  76.             update(1,1,n,a,b);
  77.         }
  78.         if(op == 1)
  79.         {
  80.             a++, b++;
  81.             sol = suf = -1e18;
  82.             query(1,1,n,a,b);
  83.             cout << max(sol,0LL) << '\n';
  84.         }
  85.     }
  86.     return 0;
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement