样例没过。
#include <bits/stdc++.h>
#define LL long long
#define ULL unsigned long long
//#define int long long
//#define double long double
#define FOR(i,l,r) for(int i=l;i<=r;++i)
#define ROF(i,r,l) for(int i=r;i>=l;--i)
#define mkp make_pair
#define fr first
#define se second
#define pb push_back
#define cmax(a,b) a=max(a,b)
#define cmin(a,b) a=min(a,b)
using namespace std;
void IOS() {
ios::sync_with_stdio(false);
cin.tie(0);
}
void Document() {
freopen(".in","r",stdin);
freopen(".out","w",stdout);
}
inline int read(){
int s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {s=(s<<3)+(s<<1)+(ch^48);ch=getchar();}
return s*w;
}
inline void write(int x){
if(x<0){putchar('-');x=-x;}
if(x>9) write(x/10);
putchar(x%10+'0');
}
void Tell() {
//写数据结构注意初始化!
//浮点数类题目过不了优先考虑精度!
//vector动态开点注意内存重分配!
//有本地写freopen!没本地别写!!!
//最后几分钟给我老老实实坐那里,别手贱!!!
//long long 级别的常数运算一定要用 xll!!!
//一定要手玩几组极限数据,防止爆数。
//大数据关同步流! 大数据关同步流! 大数据关同步流!
//删调试!删调试!删调试!删调试!删调试!
}
const int N=1e5+10;
int n,m,q,a[N],b[N],tot,tmp[2][30],cnt[2],root[N];
struct Ask {
char op;
int x,y,k;
}ak[N];
struct Node {
int ls,rs;
int siz;
}rt;
vector<Node>t;
int Get(int x) {
return lower_bound(b+1,b+m+1,x)-b;
}
int Build(int nod) {
t.pb(rt);
t[++tot]=t[nod];
return tot;
}
int change(int p,int l,int r,int x,int v) {
p=Build(p);t[p].siz+=v;
if(l==r) return p;
int mid=l+r>>1,z;
if(x<=mid) z=change(t[p].ls,l,mid,x,v),t[p].ls=z;
else z=change(t[p].rs,mid+1,r,x,v),t[p].rs=z;
return p;
}
int query(int l,int r,int k) {
if(l==r) return l;
int sum=0,mid=l+r>>1;
FOR(i,1,cnt[1]) sum+=t[t[tmp[1][i]].ls].siz;
FOR(i,1,cnt[0]) sum-=t[t[tmp[0][i]].ls].siz;
if(k<=sum) {
FOR(p,0,1) FOR(i,1,cnt[p]) tmp[p][i]=t[tmp[p][i]].ls;
return query(l,mid,k);
} else {
FOR(p,0,1) FOR(i,1,cnt[p]) tmp[p][i]=t[tmp[p][i]].rs;
return query(mid+1,r,k-sum);
}
}
void add(int x,int v) {
int id=Get(a[x]);
for(int i=x;i<=n;i+=i&-i) root[i]=change(root[i],1,m,id,v);
}
int ask(int l,int r,int k) {
memset(tmp,0,sizeof tmp);
cnt[0]=cnt[1]=0;
for(int x=r;x;x-=x&-x) tmp[1][++cnt[1]]=root[x];
for(int x=l-1;x;x-=x&-x) tmp[0][++cnt[0]]=root[x];
return query(1,m,k);
}
int zl=0;
main() {
cin>>n>>q;t.pb(rt);
FOR(i,1,n) a[i]=read(),b[++zl]=a[i];
FOR(i,1,q) {
cin>>ak[i].op;
ak[i].x=read(),ak[i].y=read();
if(ak[i].op=='Q') ak[i].k=read();
else b[++zl]=ak[i].y;
}
sort(b+1,b+zl+1);
m=unique(b+1,b+zl+1)-b-1;
FOR(i,1,n) add(i,1);
FOR(i,1,q) {
if(ak[i].op=='Q') printf("%d\n",a[ask(ak[i].x,ak[i].y,ak[i].k)]);
else {
add(ak[i].x,-1);
a[ak[i].x]=ak[i].y;
add(ak[i].x,1);
}
}
return 0;
}
马蜂奇特,玄学 vector。