rt,全 RE 了,但是我自己下载了第一个测试点的数据,本地 AC 了呀
#include<bits/stdc++.h>
#define mid (l+r>>1)
using namespace std;
const int N=1e5+1;
int n,m,a[N],tot,root[N];
vector<int> Node[2],num;
struct Que {
bool op; int x,y,z;
}Q[N];
struct node {
int cnt,l,r;
}T[N*20];
void update(int &rt,int l,int r,int p,int v) {
if (!rt) rt=(++tot); T[rt].cnt+=v; if (l==r) return;
p<=mid?update(T[rt].l,l,mid,p,v):update(T[rt].r,mid+1,r,p,v);
}
int query(int l,int r,int k)
{
if (l==r) return l; int sum=0;
for (int o:Node[0]) sum+=T[T[o].l].cnt;
for (int o:Node[1]) sum-=T[T[o].l].cnt;
if (k<=sum)
{
for (int &o:Node[0]) o=T[o].l;
for (int &o:Node[1]) o=T[o].l;
return query(l,mid,k);
}
else
{
for (int &o:Node[0]) o=T[o].r;
for (int &o:Node[1]) o=T[o].r;
return query(mid+1,r,k-sum);
}
}
int change(int pos,int val) {
int p=lower_bound(num.begin(),num.end(),a[pos])-num.begin();
for (int i=pos;i<=n;i+=i&-i) update(root[i],0,num.size()-1,p,val);
}
int Query(int l,int r,int k)
{
Node[0].clear(),Node[1].clear();
for (int i=r;i;i-=i&-i) Node[0].push_back(root[i]);
for (int i=l-1;i;i-=i&-i) Node[1].push_back(root[i]);
return query(0,num.size()-1,k);
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++) scanf("%d",&a[i]),num.push_back(a[i]);
for (int i=0;i<m;i++) { char ch; cin>>ch; Q[i].op=(ch=='Q');
if (ch=='Q') scanf("%d%d%d",&Q[i].x,&Q[i].y,&Q[i].z); else
scanf("%d%d",&Q[i].x,&Q[i].y); num.push_back(Q[i].y); } sort(num.begin(),num.end() );
num.erase(unique(num.begin(),num.end() ),num.end() ); for (int i=1;i<=n;i++) change(i,1);
for (int i=0;i<m;i++) if (Q[i].op) printf("%d\n",num[Query(Q[i].x,Q[i].y,Q[i].z)]);
else change(Q[i].x,-1),a[Q[i].x]=Q[i].y,change(Q[i].x,1); return 0;
}