Advertisement
999ms

Untitled

Nov 9th, 2019
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.65 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define all(x) (x).begin(),(x).end()
  3.  
  4. using namespace std;
  5. using ll = long long;
  6.  
  7. struct Node;
  8.  
  9. void rsum(Node* v);
  10.  
  11. struct Node {
  12.     ll sum = 0;
  13.     ll maxsum = 0;
  14.     ll toLeft = 0;
  15.     ll toRight = 0;
  16.     int l = -1, r = -1;
  17.     Node(int l, int r) : l(l), r(r) {
  18.         rsum(this);
  19.     }
  20.     Node(int key = 0) : sum(key), maxsum(key), toLeft(key), toRight(key), l(-1), r(-1) {
  21.     }
  22. };
  23.  
  24. int ITR = 0;
  25. const int MSIZE = 3 * (1 << 21);
  26. Node BUFFER[MSIZE];
  27.  
  28. __inline__ void rsum(Node* v) {
  29.     if (v->l == -1 && v->r == -1) {
  30.         v->maxsum = v->sum;
  31.         v->toLeft = v->sum;
  32.         v->toRight = v->sum;
  33.         return;
  34.     }
  35.     if (v->r == -1) {
  36.         v->sum = BUFFER[v->l].sum;
  37.         v->maxsum = BUFFER[v->l].maxsum;
  38.         v->toLeft = BUFFER[v->l].toLeft;
  39.         v->toRight = BUFFER[v->l].toRight;
  40.         return;
  41.     }
  42.     if (v->l == -1) {
  43.         v->sum = BUFFER[v->r].sum;
  44.         v->maxsum = BUFFER[v->r].maxsum;
  45.         v->toLeft = BUFFER[v->r].toLeft;
  46.         v->toRight = BUFFER[v->r].toRight;
  47.         return;
  48.     }
  49.     v->sum = BUFFER[v->l].sum + BUFFER[v->r].sum;
  50.     v->toLeft = max(BUFFER[v->r].sum + BUFFER[v->l].toLeft, BUFFER[v->r].toLeft);
  51.     v->toRight = max(BUFFER[v->l].sum + BUFFER[v->r].toRight, BUFFER[v->l].toRight);
  52.     v->maxsum = max(BUFFER[v->l].maxsum, BUFFER[v->r].maxsum);
  53.     v->maxsum = max(v->maxsum, BUFFER[v->l].toLeft + BUFFER[v->r].toRight);
  54. }
  55.  
  56. int CreateNode(int val) {
  57.     BUFFER[ITR] = Node(val);
  58.     rsum(&BUFFER[ITR]);
  59.     return ITR++;
  60. }
  61.  
  62. int CreateNode(int l, int r) {
  63.     BUFFER[ITR].l = l;
  64.     BUFFER[ITR].r = r;
  65.     rsum(&BUFFER[ITR]);
  66.     return ITR++;
  67. }
  68.  
  69. int Build(int tl, int tr, vector<int>& arr) {
  70.     if (tl + 1 == tr) {
  71.         return CreateNode(arr[tl]);
  72.     } else {
  73.         int tm = (tl + tr) / 2;
  74.         return CreateNode(Build(tl, tm, arr), Build(tm, tr, arr));
  75.     }
  76. }
  77.  
  78. int Update(int v, int tl, int tr, int i, int value) {
  79.     if (tl + 1 == tr) {
  80.         return CreateNode(value);
  81.     } else {
  82.         int tm = (tl + tr) / 2;
  83.         if (i < tm) {
  84.             return CreateNode(Update(BUFFER[v].l, tl, tm, i, value), BUFFER[v].r);
  85.         } else {
  86.             return CreateNode(BUFFER[v].l, Update(BUFFER[v].r, tm, tr, i, value));
  87.         }
  88.     }
  89. }
  90.  
  91.  
  92. int Get(int v, int tl, int tr, int l, int r) {
  93.     if (tl >= r || tr <= l) return -1;
  94.     if (tl >= l && tr <= r) {
  95.         return v;
  96.     } else {
  97.         int cur = ITR++;
  98.         int tm = (tl + tr) / 2;
  99.         BUFFER[cur].l = Get(BUFFER[v].l, tl, tm, l, r);
  100.         BUFFER[cur].r = Get(BUFFER[v].r, tm, tr, l, r);
  101.         rsum(&BUFFER[cur]);
  102.         return cur;
  103.     }
  104. }
  105.  
  106. ll Get(int root, int l, int r, int n) {
  107.     int ind = Get(root, 0, n, l, r);
  108.     if (ind == -1) return 0;
  109.     return BUFFER[ind].maxsum;
  110. }
  111.  
  112. map<int, int> vers;
  113.  
  114. int main() {
  115.     ios_base::sync_with_stdio(false);
  116.     cin.tie(nullptr);
  117.     cout.tie(nullptr);
  118.     int n, D;
  119.     cin >> n >> D;
  120.     vector<int> arr(n);
  121.     for (int i = 0; i < n; i++) {
  122.         cin >> arr[i];
  123.     }
  124.     vers[0] = Build(0, n, arr);
  125.     int m;
  126.     cin >> m;
  127.     while (m--) {
  128.         int d, x, y;
  129.         cin >> d >> x >> y;
  130.         auto it = prev(vers.end())->second;
  131.         it = Update(it, 0, n, x - 1, y);
  132.         vers[d] = it;
  133.     }
  134.     const int DEFITR = ITR;
  135.  
  136.     int q;
  137.     cin >> q;
  138.     ll z = 0;
  139.     for (int i = 1; i <= q; i++) {
  140.         int d = (z + i) % D + 1;
  141.         int l, r;
  142.         cin >> l >> r;
  143.         l--, r--;
  144.         auto it = prev(vers.upper_bound(d))->second;
  145.         z = max(Get(it, l, r + 1, n), 0LL);
  146.         ITR = DEFITR;
  147.         cout << z << "\n";
  148.     }
  149. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement