Guest User

Juanzhang

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