rt,真的不知道哪里错了啊 QAQ 感觉所有地方写的都很正常/kk
#include <iostream>
#include <cstring>
#define MAXN 200000
using namespace std;
int tr[MAXN + 10], n, m, tot;
int lowbit(int x) {return (x & (-x));}
void add(int pos, int val) {
for(; pos <= n; pos += lowbit(pos))
tr[pos] += val;
}
int query(int pos) {
int rest = 0;
while(pos) {
rest += tr[pos];
pos -= lowbit(pos);
}
return rest;
}
//type = 0 query
//type = 1 insert
//type = 2 delete
struct node {
int type, val, l, r, ind;
//For type = 0
//[l, r] val ind = i
//For type = 1/2
// l val ind = i
} Q[MAXN * 2 + 10], qa[MAXN * 2 + 10], qb[MAXN * 2 + 10];
int ans[MAXN + 10], a[MAXN + 10];
void twofen(int l, int r, int s, int t) {
if(l > r) return ;
if(s == t) {
for(int p = l; p <= r; p++)
if(!Q[p].type)
ans[Q[p].ind] = s;
return ;
}
int mid = (s + t) >> 1, ta = 0, tb = 0;
for(int p = l; p <= r; p++) {
if(Q[p].type == 0) {
int qr = query(Q[p].r) - query(Q[p].l - 1);
if(qr >= Q[p].val) qa[++ta] = Q[p];
else Q[p].val -= qr, qb[++tb] = Q[p];
}
else if(Q[p].type == 1) {
if(Q[p].val <= mid) add(Q[p].l, 1), qa[++ta] = Q[p];
else qb[++tb] = Q[p];
}
else if(Q[p].type == 2) {
if(Q[p].val <= mid) add(Q[p].l, -1), qa[++ta] = Q[p];
else qb[++tb] = Q[p];
}
}
for(int p = l; p <= r; p++)
if(Q[p].val <= mid)
if(Q[p].type == 1) add(Q[p].l, -1);
else if(Q[p].type == 2) add(Q[p].l, 1);
for(int p = l, i = 1; i <= ta; p++, i++) Q[p] = qa[i];
for(int p = l + ta, i = 1; i <= tb; p++, i++) Q[p] = qb[i];
twofen(l, l + ta - 1, s, mid);
twofen(l + ta, r, mid + 1, t);
}
int main() {
freopen("read.txt", "r", stdin);
freopen("write.txt", "w", stdout);
cin >> n >> m;
for(int p = 1; p <= n; p++) {
tot++;
cin >> a[p], Q[tot].val = a[p];
Q[tot].type = 1, Q[tot].l = p;
}
char opt;
int qt = 0;
for(int p = 1; p <= m; p++) {
cin >> opt;
if(opt == 'Q') {
tot++;
cin >> Q[tot].l >> Q[tot].r >> Q[tot].val;
Q[tot].ind = ++qt, Q[tot].type = 0;
}
else {
int rest; tot++;
cin >> Q[tot].l >> rest;
Q[tot].val = a[p];
Q[tot].type = 2;
tot++;
Q[tot].l = Q[tot - 1].l, Q[tot].val = rest;
Q[tot].type = 1, a[p] = rest;
}
}
twofen(1, tot, 0, 1e9);
for(int p = 1; p <= qt; p++)
cout << ans[p] << endl;
}