50分一半WA
#include <bits/stdc++.h>
#define int long long
#define lowbit(x) ((x)&-(x))
using namespace std;
int n, q, a[400005], c[400005], ans[400005], left_=INT_MAX, right_=INT_MIN;
struct quest{
int id, x, y, k, op;
} questions[400005], lq[400005], rq[400005];
void update(int x, int val = 1) {
for (int i=x; i<=n; i+=lowbit(i))
c[i] += val;
}
int query(int x, int y) {
if (x > y) swap(x, y);
int ans = 0;
for (int i=y; i>=1; i-=lowbit(i))
ans += c[i];
for (int i=x-1; i>=1; i-=lowbit(i))
ans -= c[i];
return ans;
}
void solve(int l, int r, int ql, int qr) { // 值域
if (ql > qr || l > r) return;
if (l == r) {
for (int i=ql; i<=qr; i++) {
if (questions[i].op == 2)
ans[questions[i].id] = l;
}
return;
}
int mid = (l + r) >> 1;
int lt=0, rt=0;
for (int i=ql; i<=qr; i++) {
quest &q = questions[i];
if (q.op == 1) {
if (q.y <= mid)
update(q.x, q.k),
lq[++lt] = q;
else rq[++rt] = q;
}
if (q.op == 2) {
int cnt = query(q.x, q.y);
if (cnt >= q.k) lq[++lt] = q;
else q.k -= cnt,
rq[++rt] = q;
}
}
for (int i=ql; i<=qr; i++) {
if (questions[i].op == 1 && questions[i].y <= mid)
update(questions[i].x, -questions[i].k);
}
for (int i=1; i<=lt; i++) questions[ql+i-1] = lq[i];
for (int i=1; i<=rt; i++) questions[ql+lt+i-1] = rq[i];
solve(l, mid, ql, ql+lt-1),
solve(mid+1, r, ql+lt, qr);
}
signed main() {
scanf("%lld%lld", &n, &q);
for (int i=1; i<=n; i++) scanf("%lld", &a[i]);
int x = 1;
for (int i=1; i<=n; i++) {
int id = a[i];
a[i] = id;
left_ = min(left_, id),
right_ = max(right_, id);
questions[x] = {x, i, a[i], 1, 1};
x++;
}
for (int as=1; as<=q; as++) {
int l, r, k;
char c;
while (scanf("%c", &c) && c != 'Q' && c != 'C');
if (c == 'Q') {
scanf("%lld%lld%lld", &l, &r, &k);
questions[++x] = {x, l, r, k, 2};
} else {
scanf("%lld%lld", &l, &k);
questions[++x] = {x, l, a[l], -1, 1};
a[l] = k;
questions[++x] = {x, l, a[l], 1, 1};
}
}
solve(left_, right_, 1, x);
for (int j=n+1; j<=x; j++) {
if (ans[j])
printf("%lld\n", ans[j]);
}
return 0;
}