自己对拍答案是对的,纯超时问题
#include<bits/stdc++.h>
using namespace std;
int n,minn,rot=0,tot=0,sum=0;
struct node{
int val,siz,tag,l,r;
}a[100100];
int newnode(int x){tot++;a[tot].val=x,a[tot].siz=1,a[tot].l=a[tot].r=a[tot].tag=0;return tot;}
void pushup(int x){a[x].siz=a[a[x].l].siz+a[a[x].r].siz+1;}
void pushdown(int x){a[x].val+=a[x].tag;a[a[x].l].tag+=a[x].tag;a[a[x].r].tag+=a[x].tag;a[x].tag=0;}
int merge(int x,int y){
if(!x||!y) return x+y;
if(rand()%(a[x].siz+a[y].siz)<=a[x].siz){
pushdown(x);
a[x].r=merge(a[x].r,y);
pushup(x);
return x;
}
else{
pushdown(y);
a[y].l=merge(x,a[y].l);
pushup(y);
return y;
}
}
void split(int now,int k,int &atl,int &atr){
if(!now){
atl=atr=0;
return;
}
pushdown(now);
if(a[now].val<=k) split(a[now].r,k,a[atl=now].r,atr);
else split(a[now].l,k,atl,a[atr=now].l);
pushup(now);
}
int kth(int k){
int now=rot;
pushdown(now);
while(a[a[now].l].siz+1!=k){
if(a[a[now].l].siz<k) k-=(a[a[now].l].siz+1),now=a[now].r;
else now=a[now].l;
pushdown(now);
}
return a[now].val;
}
void print(int now){
if(!now) return;
print(a[now].l);
printf("%d %d",a[now].val,a[now].tag);puts("");
print(a[now].r);
}
int main(){
int x,y,z;
char kind;int k;
scanf("%d%d",&n,&minn);
for(int i=1;i<=n;i++){
scanf("%s%d",&kind,&k);
if(kind=='I'){
if(k<minn) continue;
split(rot,k,x,y);
rot=merge(merge(x,newnode(k)),y);
}
else if(kind=='A'){
// split(rot,minn-k-1,x,rot);
// sum+=a[x].siz;
a[rot].tag+=k;
}
else if(kind=='S'){
split(rot,minn+k-1,x,rot);
sum+=a[x].siz;
a[rot].tag-=k;
}
else{
k=a[rot].siz-k+1;
// cout<<a[rot].siz<<" "<<k;
if(k<1||a[rot].siz<k) puts("-1");
else printf("%d",kth(k)),puts("");
}
// print(rot);puts("");
}
printf("%d",sum);
}