思路肯定没问题,卡在特殊样例了
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+500;
int n,m,bsz,bcnt;
int bl[N],br[N],cnt[N],bel[N];
bool cun[N];
long long a[N],sum[N];
inline int read(){
int t=0,f=1;
register char c=getchar();
while (c<48||c>57) f=(c=='-')?(-1):(f),c=getchar();
while (c>=48&&c<=57)t=(t<<1)+(t<<3)+(c^48),c=getchar();
return f*t;
}
inline long long readl(){
long long t=0,f=1;
register char c=getchar();
while (c<48||c>57) f=(c=='-')?(-1):(f),c=getchar();
while (c>=48&&c<=57)t=(t<<1)+(t<<3)+(c^48),c=getchar();
return f*t;
}
void init(){
bsz=sqrt(n+m+1000),bcnt=ceil((double)(n+m+1000)/bsz);
for(long long i=1;i<=bcnt;i++){
bl[i]=(i-1)*bsz+1,br[i]=i*bsz;
for(long long j=bl[i];j<=br[i];j++){
if(cun[j]) cnt[i]++;
sum[i]+=a[j];
bel[j]=i;
// cout<<"i:"<<i<<" sum[i]:"<<sum[i]<<"\n";
}
}
}
long long qiuhe(){
long long ans=0;
for(long long i=1;i<=bcnt;i++) ans+=sum[i];
return ans;
}
void jian(long long x,long long y){
if(!cun[x]) return;
sum[bel[x]]-=a[x];
a[x]-=y;
sum[bel[x]]+=a[x];
}
void jia(long long x,long long y){
if(!cun[x]) cnt[bel[x]]++,cun[x]=true;
sum[bel[x]]-=a[x];
a[x]=y;
sum[bel[x]]+=a[x];
}
void fen(long long x){
long long res=0,d;
for(long long i=1;i<=bcnt;i++){
res+=cnt[i];
if(res>=x) {d=i,res-=cnt[i];break;}
}
for(long long i=bl[d];i<=br[d];i++){
if(cun[i]){
res++;
if(res==x){
cun[i]=false;
cnt[d]--;
sum[d]-=a[i];
a[i]=0;
return;
}
}
}
}
int main(){
n=read(),m=read();
for(long long i=1;i<=n;i++) a[i]=readl(),cun[i]=true;
init();
while(m--){
char fu;
cin>>fu;
if(fu=='Q') printf("%lld\n",qiuhe());
else if(fu=='C'){
long long x=readl(),y=readl();
jian(x,y);
}else if(fu=='I'){
long long x=readl(),y=readl();
jia(x,y);
}else{
long long x=readl();
fen(x);
}
}
return 0;
}