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
|
#include <algorithm> #include <cstdio> #include <cstring> #include <map> #include <vector>
static int const N = 60005; static int const NM = 2000000; int n, m, nn, a[N], arr_rt[N], bit_rt[N], rec[N]; struct Query { int o, i, j, k; } q[N]; struct SegmentTree { int ch[2], sum; } nd[NM];
int create(int rt = 0) { return nd[++nn] = nd[rt], nn; }
int arr_insert(int rt, int p) { rt = create(rt), ++nd[rt].sum; int L = 0, R = N; for (int cur = rt; L < R;) { int MID = L + R >> 1, b = p > MID; nd[cur].ch[b] = create(nd[cur].ch[b]), ++nd[nd[cur].ch[b]].sum, cur = nd[cur].ch[b]; b ? L = MID + 1 : R = MID; } return rt; }
void bit_insert(int &rt, int p, int v) { if (rt == 0) rt = create(); nd[rt].sum += v; int L = 0, R = N; for (int cur = rt; L < R;) { int MID = L + R >> 1, b = p > MID; if (nd[cur].ch[b] == 0) nd[cur].ch[b] = create(); nd[nd[cur].ch[b]].sum += v; int tmp = nd[cur].ch[b]; cur = tmp, b ? L = MID + 1 : R = MID; } }
int bit_add(int p, int v, int c) { for (; p <= n; p += p & -p) bit_insert(bit_rt[p], v, c); }
int main() { int T; scanf("%d", &T); for (; T--;) { std::map<int, int> mp; memset(arr_rt, nn = 0, sizeof arr_rt), memset(bit_rt, 0, sizeof bit_rt); scanf("%d%d", &n, &m); for (int i = 1; i <= n; ++i) scanf("%d", &a[i]), mp[a[i]] = 0; for (int i = 1; i <= m; ++i) { char c; scanf(" %c", &c); if (c == 'Q') q[i].o = 0, scanf("%d%d%d", &q[i].i, &q[i].j, &q[i].k); else q[i].o = 1, scanf("%d%d", &q[i].i, &q[i].j), mp[q[i].j] = 0; } int cnt = 0; for (std::map<int, int>::iterator it = mp.begin(); it != mp.end(); ++it) rec[cnt] = it->first, it->second = cnt++; for (int i = 1; i <= n; ++i) arr_rt[i] = arr_insert(arr_rt[i - 1], mp[a[i]]); for (int i = 1; i <= m; ++i) { if (q[i].o == 0) { std::vector<int> a, b; a.push_back(arr_rt[q[i].i - 1]), b.push_back(arr_rt[q[i].j]); for (int p = q[i].i - 1; p; p -= p & -p) a.push_back(bit_rt[p]); for (int p = q[i].j; p; p -= p & -p) b.push_back(bit_rt[p]); int L = 0, R = N; for (; L < R;) { int sum = 0; for (int i = 0; i < a.size(); ++i) sum -= nd[nd[a[i]].ch[0]].sum; for (int i = 0; i < b.size(); ++i) sum += nd[nd[b[i]].ch[0]].sum; int MID = L + R >> 1; if (sum < q[i].k) { L = MID + 1, q[i].k -= sum; for (int i = 0; i < a.size(); ++i) a[i] = nd[a[i]].ch[1]; for (int i = 0; i < b.size(); ++i) b[i] = nd[b[i]].ch[1]; } else { R = MID; for (int i = 0; i < a.size(); ++i) a[i] = nd[a[i]].ch[0]; for (int i = 0; i < b.size(); ++i) b[i] = nd[b[i]].ch[0]; } } printf("%d\n", rec[L]); } else bit_add(q[i].i, mp[a[q[i].i]], -1), bit_add(q[i].i, mp[a[q[i].i] = q[i].j], 1); } } return 0; }
|