Guest User

Juanzhang

a guest
Jun 5th, 2019
221
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.06 KB | None | 0 0
  1. #include <cstring>
  2. #include <cstdio>
  3. using namespace std;
  4.  
  5. const int maxn = 1e5 + 10;
  6. int n, m, tot, val[maxn], ans[maxn];
  7. int Q[maxn * 3], Q1[maxn * 3], Q2[maxn * 3];
  8.  
  9. struct BIT {
  10.   int now, c[maxn], t[maxn];
  11.  
  12.   void clr() { ++now; }
  13.  
  14.   void add(int pos, int v) {
  15.     for (; pos <= n; pos += pos & -pos) {
  16.       t[pos] < now ? t[pos] = now, c[pos] = v : c[pos] += v;
  17.     }
  18.   }
  19.  
  20.   int query(int pos) {
  21.     int res = 0;
  22.     for (; pos; pos &= pos - 1) {
  23.       res += t[pos] < now ? 0 : c[pos];
  24.     }
  25.     return res;
  26.   }
  27. } bit;
  28.  
  29. struct node {
  30.   int x, y, k, tid;
  31.  
  32.   node() {}
  33.   node(int _x, int _y, int _k, int _t) :
  34.     x(_x), y(_y), k(_k), tid(_t) {}
  35. } a[maxn * 3];
  36.  
  37. void divide(int l, int r, int ql, int qr) {
  38.   if (l > r) return;
  39.   if (ql == qr) {
  40.     for (int i = l; i <= r; i++) {
  41.       ans[a[Q[i]].tid] = ql;
  42.     }
  43.     return;
  44.   }
  45.   bit.clr();
  46.   int mid = (ql + qr) >> 1, p1 = 0, p2 = 0;
  47.   for (int i = l; i <= r; i++) {
  48.     node &val = a[Q[i]];
  49.     if (val.tid) {
  50.       int s = bit.query(val.y) - bit.query(val.x - 1);
  51.       val.k > s ? val.k -= s, Q2[++p2] = Q[i] : Q1[++p1] = Q[i];
  52.     } else {
  53.       val.y <= mid ? bit.add(val.x, val.k), Q1[++p1] = Q[i] : Q2[++p2] = Q[i];
  54.     }
  55.   }
  56.   for (int i = 1; i <= p1; i++) {
  57.     Q[l + i - 1] = Q1[i];
  58.   }
  59.   for (int i = 1; i <= p2; i++) {
  60.     Q[r - p2 + i] = Q2[i];
  61.   }
  62.   divide(l, l + p1 - 1, ql, mid);
  63.   divide(l + p1, r, mid + 1, qr);
  64. }
  65.  
  66. int main() {
  67.   scanf("%d %d", &n, &m);
  68.   for (int i = 1; i <= n; i++) {
  69.     scanf("%d", val + i);
  70.     a[++tot] = node(i, val[i], 1, 0);
  71.   }
  72.   for (int i = 1; i <= m; i++) {
  73.     char op; int x, y, k;
  74.     scanf("%s %d %d", &op, &x, &y);
  75.     if (op == 'C') {
  76.       a[++tot] = node(x, val[x], -1, 0);
  77.       a[++tot] = node(x, y, 1, 0), val[x] = y;
  78.     } else {
  79.       scanf("%d", &k);
  80.       a[++tot] = node(x, y, k, i);
  81.     }
  82.   }
  83.   memset(ans, -1, sizeof ans);
  84.   for (int i = 1; i <= tot; i++) {
  85.     Q[i] = i;
  86.   }
  87.   divide(1, tot, 1, 1e9);
  88.   for (int i = 1; i <= m; i++) {
  89.     if (~ans[i]) printf("%d\n", ans[i]);
  90.   }
  91.   return 0;
  92. }
Add Comment
Please, Sign In to add comment