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 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
| #include<bits/stdc++.h> using namespace std; const int MAXn = 1e5; const int MAXm = 1e5; const int MAXcntele = MAXn * 2 + MAXm * 2; const int MAXa = 1e9; const int NINF = 0xc0c0c0c0;
template <typename T> inline void read(T &a) { char c;for (c = getchar(); (c < '0' || c > '9') && c != '-'; c = getchar());bool f = c == '-';T x = f ? 0 : (c ^ '0');for (c = getchar(); c >= '0' && c <= '9'; c = getchar()) {x = x * 10 + (c ^ '0');}a = f ? -x : x; } template <typename T, typename ...Argv> inline void read(T &a, Argv &...argv) { read(a), read(argv...); }
int t[MAXn + 10]; inline int lowbit(int x) { return x & -x; } inline void modify(int p, int v, int n) { while (p <= n) { t[p] += v; p += lowbit(p); } } inline int querysum(int p) { if (p == 0) return 0; int ans = 0; while (p) { ans += t[p]; p -= lowbit(p); } return ans; } inline int querysec(int l, int r) { return querysum(r) - querysum(l - 1); }
int n, m; int a[MAXn + 10]; struct MQ { int opt, x, y, z; }; MQ mq[MAXm + 10];
int cntquery; struct Ele { int opt; int p, v, w; int l, r, rk, idx; }; int cntele; Ele ele[MAXcntele + 10]; Ele elel[MAXcntele + 10]; Ele eler[MAXcntele + 10];
int ans[MAXm + 10]; void totdiv(int l, int r, int L, int R) { if (l > r) return; if (L == R) { for (int i = l; i <= r; ++i) { if (ele[i].opt == 2) { ans[ele[i].idx] = L; } } return; } int M = (L + R) >> 1; int cntelel = 0, cnteler = 0; for (int i = l; i <= r; ++i) { if (ele[i].opt == 1) { if (ele[i].v <= M) { modify(ele[i].p, ele[i].w, n); elel[++cntelel] = ele[i]; } else { eler[++cnteler] = ele[i]; } } else { int tmp = querysec(ele[i].l, ele[i].r); if (ele[i].rk <= tmp) { elel[++cntelel] = ele[i]; } else { eler[++cnteler] = ele[i]; eler[cnteler].rk -= tmp; } } } copy(elel + 1, elel + 1 + cntelel, ele + l); copy(eler + 1, eler + 1 + cnteler, ele + l + cntelel); totdiv(l, l + cntelel - 1, L, M); totdiv(l + cntelel, r, M + 1, R); }
signed main() { read(n, m); for (int i = 1; i <= n; ++i) { read(a[i]); ele[++cntele] = Ele{opt: 1, p: i, v: a[i], w: 1, l: NINF, r: NINF, rk: NINF, idx: NINF}; } char opt[10]; for (int i = 1, x, y, z; i <= m; ++i) { scanf("%s", opt); if (*opt == 'Q') { read(x, y, z); ele[++cntele] = Ele{opt: 2, p: NINF, v: NINF, w: NINF, l: x, r: y, rk: z, idx: ++cntquery}; } else { read(x, y); ele[++cntele] = Ele{opt: 1, p: x, v: a[x], w: -1, l: NINF, r: NINF, rk: NINF, idx: NINF}; a[x] = y; ele[++cntele] = Ele{opt: 1, p: x, v: a[x], w: 1, l: NINF, r: NINF, rk: NINF, idx: NINF}; } } for (int i = 1; i <= n; ++i) { ele[++cntele] = Ele{opt: 1, p: i, v: a[i], w: -1, l: NINF, r: NINF, rk: NINF, idx: NINF}; } totdiv(1, cntele, 0, MAXa); for (int i = 1; i <= cntquery; ++i) { printf("%d\n", ans[i]); } return 0; }
|