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
| #include<bits/stdc++.h> using namespace std; #define endl '\n' #define FL(a,b,c) for(int a=(b),a##end=(c);a<=a##end;++a) #define FR(a,b,c) for(int a=(b),a##end=(c);a>=a##end;--a) #define lowbit(x) ((x)&-(x)) #define eb emplace_back #define sz(x) (int)((x).size()) #define int long long #define vt vector #define fr first #define se second #define mmt(x, y) memset(x, y, sizeof x) #define PII pair<int, int> #define max(a, b)({auto f7r=(a);auto j3h=(b);f7r<j3h?j3h:f7r;}) #define cmax(a, b)({auto j3h=(b);(j3h>a)&&(a=j3h);}) #define min(a, b)({auto f7r=(a);auto j3h=(b);f7r>j3h?j3h:f7r;}) #define cmin(a, b)({auto j3h=(b);(j3h<a)&&(a=j3h);}) constexpr int N = 1e5 + 10, M = 400; int n, m, D[N * 2], a[N], len, L[M], R[M], b1, b2; int s1[M][M], s2[M][N * 2], id1[N], id2[N * 2], t1[M], t2[N * 2]; struct A{int l, r, k;}Q[N]; int query(int l, int r, int k){ if(id1[l] == id1[r]){ FL(i, l, r)t2[i] = a[i]; nth_element(t2 + l, t2 + l + k - 1, t2 + r + 1); int ans = t2[l + k - 1]; FL(i, l, r)t2[i] = 0; return ans; } int s; FL(i, l, R[id1[l]])t1[id2[a[i]]]++, t2[a[i]]++; FR(i, r, L[id1[r]])t1[id2[a[i]]]++, t2[a[i]]++; FL(i, 1, id2[len]){ if(k > (s = t1[i] + s1[id1[r] - 1][i] - s1[id1[l]][i]))k -= s; else{ FL(j, (i - 1) * b2 + 1, i * b2){ if(k > (s = t2[j] + s2[id1[r] - 1][j] - s2[id1[l]][j]))k -= s; else{ FL(i, l, R[id1[l]])t1[id2[a[i]]]--, t2[a[i]]--; FR(i, r, L[id1[r]])t1[id2[a[i]]]--, t2[a[i]]--; return j; } } } } return 0; } void modify(int pos, int k){ FL(i, id1[pos], id1[n]) s1[i][id2[a[pos]]]--, s2[i][a[pos]]--, s1[i][id2[k]]++, s2[i][k]++; a[pos] = k; } int32_t main(){ cin.tie(0)->sync_with_stdio(0); cin >> n >> m; FL(i, 1, n)cin >> a[i], D[++len] = a[i]; FL(i, 1, m){ char op;cin >> op; if(op == 'Q')cin >> Q[i].l >> Q[i].r >> Q[i].k; else Q[i].l = 0, cin >> Q[i].r >> Q[i].k, D[++len] = Q[i].k; } sort(D + 1, D + 1 + len), len = unique(D + 1, D + 1 + len) - D - 1; b1 = sqrt(n), b2 = sqrt(len); FL(i, 1, n)id1[i] = (i - 1) / b1 + 1, a[i] = lower_bound(D + 1, D + 1 + len, a[i]) - D; FL(i, 1, len)id2[i] = (i - 1) / b2 + 1; FL(i, 1, id1[n]){ L[i] = R[i - 1] + 1, R[i] = min(L[i] + b1 - 1, n); FL(j, 1, id2[len])s1[i][j] = s1[i - 1][j]; FL(j, 1, len)s2[i][j] = s2[i - 1][j]; FL(j, L[i], R[i])s1[i][id2[a[j]]]++, s2[i][a[j]]++; } FL(i, 1, m){ if(Q[i].l)cout << D[query(Q[i].l, Q[i].r, Q[i].k)] << endl; else modify(Q[i].r, lower_bound(D + 1, D + 1 + len, Q[i].k) - D); } return 0; }
|