1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
| #include <bits/stdc++.h> #define lowbit(x) ((x) & (-(x))) using namespace std;
const int MAX = 1e5 + 50; struct Q { int l, r, type, x, id; Q() {} Q(int _l, int _r, int _type, int _x, int _id = 0) : l(_l), r(_r), type(_type), x(_x), id(_id) {} } q[MAX << 2], lq[MAX << 2], rq[MAX << 2]; int a[MAX], c[MAX], ans[MAX], n, m, cnt;
void add(int x, int y) { for (int i = x; i <= n; i += lowbit(i)) c[i] += y; }
int query(int l, int r) { int res = 0; for (int i = r; i >= 1; i -= lowbit(i)) res += c[i]; for (int i = l - 1; i >= 1; i -= lowbit(i)) res -= c[i]; return res; }
void solve(int l, int r, int L, int R) { if (l > r || L > R) return; if (l == r) { for (int i = L; i <= R; i++) if (q[i].type == 2) ans[q[i].id] = l; return; } int mid = (l + r) >> 1; int cnt1 = 0, cnt2 = 0; for (int i = L; i <= R; i++) { if (q[i].type != 2) { if (q[i].x <= mid) { add(q[i].l, q[i].type); lq[++cnt1] = q[i]; } else rq[++cnt2] = q[i]; } else { int num = query(q[i].l, q[i].r); if (q[i].x <= num) lq[++cnt1] = q[i]; else rq[++cnt2] = q[i], rq[cnt2].x -= num; } } for (int i = 1; i <= cnt1; i++) if (lq[i].type != 2) add(lq[i].l, -lq[i].type); for (int i = L; i < L + cnt1; i++) q[i] = lq[i - L + 1]; for (int i = L + cnt1; i <= R; i++) q[i] = rq[i - L - cnt1 + 1]; solve(l, mid, L, L + cnt1 - 1); solve(mid + 1, r, L + cnt1, R); }
int main(){ scanf("%d%d", &n, &m); for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); q[++cnt] = Q(i, i, 1, a[i]); } for (int i = 1; i <= m; i++) { char op; scanf(" %c", &op); if (op == 'C') { int x, y; scanf("%d%d", &x, &y); q[++cnt] = Q(x, x, -1, a[x]); q[++cnt] = Q(x, x, 1, y); a[x] = y; } else { int l, r, k; scanf("%d%d%d", &l, &r, &k); q[++cnt] = Q(l, r, 2, k, i); } } solve(-1e9, 1e9, 1, cnt); for (int i = 1; i <= m; i++) if (ans[i]) printf("%d\n", ans[i]); return 0; }
|