#include<bits/stdc++.h>
using namespace std;
struct Node{
int l,r,key,val,len;
}a[1100001];
int tot=0,rot,ans=0,m,bj=0,js;
void push_up(int p){
a[p].len=a[a[p].l].len+a[a[p].r].len+1;
}
//-----------------------------------------合并
int merge(int rot1,int rot2){
if(rot1==0){
return rot2;
}
else if(rot2==0){
return rot1;
}
if(a[rot1].key<a[rot2].key){
a[rot1].r=merge(a[rot1].r,rot2);
push_up(rot1);
return rot1;
}
else{
a[rot2].l=merge(rot1,a[rot2].l);
push_up(rot2);
return rot2;
}
}
//-----------------------------------------按权值拆
void val_split(int now,int k,int &rot1,int &rot2){
if(now==0){
rot1=0;
rot2=0;
return;
}
else if(a[now].val<=k){
rot1=now;
val_split(a[rot1].r,k,a[rot1].r,rot2);
}
else{
rot2=now;
val_split(a[rot2].l,k,rot1,a[rot2].l);
}
push_up(now);
}
//-----------------------------------------按排名拆
void k_split(int now,int k,int &rot1,int &rot2){
if(now==0){
rot1=0;
rot2=0;
return;
}
push_up(now);
if(a[a[now].l].len<k){
rot1=now;
k_split(a[rot1].r,k-a[a[rot1].l].len-1,a[rot1].r,rot2);
}
else{
rot2=now;
k_split(a[rot2].l,k,rot1,a[rot2].l);
}
push_up(now);
}
//-------------------------------------新建节点
void New_Node(int val){
if(val<m){
js--;
return;
}
a[++tot].key=rand()%114514+1;
a[tot].l=0;
a[tot].r=0;
int rot1,rot2,now=tot;
a[tot].len=1;
a[tot].val=val;
val_split(rot,val,rot1,rot2);
rot=merge(merge(rot1,now),rot2);
}
//-------------------------------------查找
void Find_val(int k){
int rot1,rot2,rot3,rot4;
k_split(rot,k-1,rot1,rot2);
k_split(rot2,1,rot3,rot4);
printf("%d\n",a[rot3].val);
rot=merge(rot1,merge(rot3,rot4));
}
//-------------------------------------删除
void Erase(int val){
int rot1,rot2,rot3,rot4;
val_split(rot,val-1,rot1,rot2);
k_split(rot2,1,rot3,rot4);
rot=merge(rot1,rot4);
}
void bfs(int val,int i){
if(i==0){
return;
}
bfs(val,a[i].l);
bfs(val,a[i].r);
if(a[i].val+val<m){
ans++;
js--;
Erase(a[i].val);
return;
}
a[i].val+=val;
push_up(i);
}
void read(int &x){
x=0;
int f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-'){
f=-f;
}
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x*=10;
x+=ch-'0';
ch=getchar();
}
x*=f;
}
//------------------------------------主函数
int main(){
srand(time(NULL));
int n;
read(n);
read(m);
for(int i=1;i<=n;i++){
char ch;
int k;
cin>>ch;
read(k);
if(ch=='I'){
New_Node(k);
js++;
}
else if(ch=='A'){
bfs(k,rot);
}
else if(ch=='S'){
bfs(-k,rot);
}
else{
if(k>a[rot].len){
printf("-1\n");
continue;
}
Find_val(js-k+1);
}
}
printf("%d",ans);
return 0;
}
#2 #3 #5 #7 #8 #9 #10 WA