加入了成断更新和查找第K大。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
using namespace std;
#define maxn 1100000
int root,ls[maxn],rs[maxn],siz[maxn],val[maxn];
int n,cnt,m,co;
inline void rotate_l(int& x)
{
int y=rs[x];
rs[x]=ls[y];
ls[y]=x;
siz[y]=siz[x];
siz[x]=siz[ls[x]]+siz[rs[x]]+1;
x=y;
}
inline void rotate_r(int& x)
{
int y=ls[x];
ls[x]=rs[y];
rs[y]=x;
siz[y]=siz[x];
siz[x]=siz[ls[x]]+siz[rs[x]]+1;
x=y;
}
inline void maintain(int& x,int fg)
{
if(!fg)
{
if(siz[ls[ls[x]]]>siz[rs[x]]) rotate_r(x);
else if(siz[rs[ls[x]]]>siz[rs[x]]) rotate_l(ls[x]),rotate_r(x);
else return;
}
else
{
if(siz[rs[rs[x]]]>siz[ls[x]]) rotate_l(x);
else if(siz[ls[rs[x]]]>siz[ls[x]]) rotate_r(rs[x]),rotate_l(x);
else return;
}
maintain(ls[x],0);maintain(rs[x],1);
maintain(x,0);maintain(x,1);
}
inline void insert(int& x,int b)
{
if(x==0)
{
cnt++;
x=cnt;
ls[x]=rs[x]=0;
siz[x]=1;
val[x]=b;
}
else
{
siz[x]++;
if(b>val[x])
{
insert(rs[x],b);
}
else
{
insert(ls[x],b);
}
maintain(x,b>=val[x]);
}
}
inline int select(int x,int rk)
{
if(siz[ls[x]]+1==rk)
{
return val[x];
}
else if(siz[ls[x]]+1>rk) return select(ls[x],rk);
return select(rs[x],rk-siz[ls[x]]-1);
}
inline void delt(int& x)
{
if(x==0) return;
if(val[x]+co<m) x=rs[x],delt(x);
else delt(ls[x]),siz[x]=siz[ls[x]]+siz[rs[x]]+1;
}
int main()
{
int a,b;
char str[10];
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%s%d",str,&b);
if(str[0]=='I')
{
if(b<m) continue;
insert(root,b-co);
}
else if(str[0]=='A') co+=b;
else if(str[0]=='S') co-=b,delt(root);
else
{
if(b>siz[root]) printf("-1\n");
else printf("%d\n",select(root,siz[root]-b+1)+co);
}
}
printf("%d\n",cnt-siz[root]);
return 0;
}