Advertisement
_rashed

KGSS - Maximum Sum

Oct 10th, 2021 (edited)
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.24 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. int arr[100005];
  9. pair<int,int> tree[500005];
  10. int n,q;
  11.  
  12. pair<int,int> _merge(pair<int,int> p1, pair<int,int> p2) {
  13.     int a[4];
  14.     a[0] = p1.first;
  15.     a[1] = p1.second;
  16.     a[2] = p2.first;
  17.     a[3] = p2.second;
  18.     int mx = -1;
  19.     int mn = -1;
  20.     for(int i = 0; i < 4; i++) {
  21.         if(a[i] != -1) {
  22.             if(mx == -1 || arr[mx] < arr[a[i]]) {
  23.                 mx = a[i];
  24.             }
  25.         }
  26.     }
  27.     for(int i = 0; i < 4; i++) {
  28.         if(a[i] != -1 && a[i] != mx) {
  29.             if(mn == -1 || arr[mn] < arr[a[i]]) {
  30.                 mn = a[i];
  31.             }
  32.         }
  33.     }
  34.     return {mx,mn};
  35. }
  36.  
  37. void build(int l = 0, int r = n-1, int p = 1) {
  38.     if(l == r) {
  39.         tree[p] = {l,-1};
  40.         return;
  41.     }
  42.     int mid = (l+r)/2;
  43.     build(l,mid,p*2);
  44.     build(mid+1,r,p*2+1);
  45.     tree[p] = _merge(tree[p*2],tree[p*2+1]);
  46. }
  47.  
  48. void update(int qt, int v, int l = 0, int r = n-1, int p = 1) {
  49.     if(l == r) {
  50.         arr[l] = v;
  51.         tree[p] = {l,-1};
  52.         return;
  53.     }
  54.     int mid = (l+r)/2;
  55.     if(qt <= mid) {
  56.         update(qt,v,l,mid,p*2);
  57.     }
  58.     else {
  59.         update(qt,v,mid+1,r,p*2+1);
  60.     }
  61.     tree[p] = _merge(tree[p*2],tree[p*2+1]);
  62. }
  63.  
  64. pair<int,int> query(int ql, int qr, int l = 0, int r = n-1, int p = 1) {
  65.     if(l > qr || r < ql) {
  66.         return {-1,-1};
  67.     }
  68.     if(l >= ql && r <= qr) {
  69.         return tree[p];
  70.     }
  71.     int mid = (l+r)/2;
  72.     return _merge(query(ql,qr,l,mid,p*2),query(ql,qr,mid+1,r,p*2+1));
  73. }
  74.  
  75. int main()
  76. {
  77.     ios_base::sync_with_stdio(false);
  78.     cin.tie(NULL);
  79.     cout.tie(NULL);
  80.     cin >> n;
  81.     for(int i = 0; i < n; i++) {
  82.         cin >> arr[i];
  83.     }
  84.     build();
  85.     cin >> q;
  86.     while(q--) {
  87.         char c;
  88.         int a,b;
  89.         cin >> c >> a >> b;
  90.         if(c == 'Q') {
  91.             pair<int,int> res = query(a-1,b-1);
  92.             //cout << "res is " << res.first << " " << res.second << "\n";
  93.             int sum = arr[res.first] + (res.second == -1 ? 0:arr[res.second]);
  94.             cout << sum << "\n";
  95.         }
  96.         else {
  97.             update(a-1,b);
  98.         }
  99.     }
  100.     return 0;
  101. }
  102.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement