#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#define rep(i,j,k) for(int i=j;i<=k;i++)
#define per(i,j,k) for(int i=j;i>=k;i--)
using namespace std;
const int maxx = 2e5+;
int lson[maxx*],rson[maxx*],sum[maxx*];
int tot=,root=;
bool laze[maxx*];
void push_down(int x){
if(laze[x]){
if(!lson[x])lson[x]=++tot;
if(!rson[x])rson[x]=++tot;
sum[lson[x]]=;
sum[rson[x]]=;
laze[lson[x]]=;
laze[rson[x]]=;
laze[x]=;
}
}
void inserts(int l,int r,int x,int &p){
if(!p)p=++tot;
if (l==r){
sum[p]++;
return;
}
int mid=(l+r)>>;
push_down(p);
if (x<=mid){
inserts(l,mid,x,lson[p]);
}else {
inserts(mid+,r,x,rson[p]);
}
sum[p]=sum[lson[p]]+sum[rson[p]];
}
void update(int l,int r,int ul,int ur,int &p){
if (!p)p=++tot;
if (ul<=l && r<=ur){
sum[p]=;
laze[p]=;
return;
}
push_down(p);
int mid=(l+r)>>;
if(ul<=mid)update(l,mid,ul,ur,lson[p]);
if(ur>mid)update(mid+,r,ul,ur,rson[p]);
sum[p]=sum[lson[p]]+sum[rson[p]];
}
int kth(int l,int r,int k,int &p){
if(l==r){
return l;
}
int mid=(l+r)>>;
push_down(p);
if(k<=sum[lson[p]]){
return kth(l,mid,k,lson[p]);
}else {
return kth(mid+,r,k-sum[lson[p]],rson[p]);
}
}
int main(){
int n,m,w;
int add=,nowmin,num=;
char op[];
while(~scanf("%d%d",&n,&nowmin)){
rep(i,,n){
scanf("%s%d",op,&w);
if (op[]=='I'){
//减去影响后如果起薪小于工资下界
if (w-add<nowmin)continue;
//他的工资实际上应该是他的起
inserts(-maxx,maxx,w-add,root);
num++;
}else if(op[]=='A'){
//偏移应该加上
add+=w;
//同时此时要求最低的工资降低
nowmin-=w;
}else if(op[]=='S'){
add-=w;
nowmin+=w;
//比最低工资低的值全部赋值为0
update(-maxx,maxx,-maxx,nowmin-,root);
}else {
//如果所有人被开除
if(w>sum[]){
printf("-1\n");
continue;
}else {
//查询剩下的第K大,并且要加上偏移
//其实等价于查询当前第K大=总数-第K小+1
printf("%d\n",kth(-maxx,maxx,sum[]-w+,root)+add);
}
}
}
printf("%d\n",num-sum[]);
}
return ;
}
05-11 23:03