1 #include<stdio.h>
2 #include<string.h>
3 #include<stdlib.h>
4 #define maxn 233333
5 using namespace std;
6 struct node{
7 int rnd,v,size,w,l,r;
8 };
9 node tr[maxn*2];
10 int read();
11 void update(int);
12 void lturn(int&);
13 void rturn(int&);
14 void insert(int&,int);
15 int del(int&);
16 int query_num(int,int);
17 int n,ad,mi,root,size,lea;
18 int main(){
19 n=read();mi=read();root=0;ad=0;size=0;lea=0;
20 for(int i=1;i<=n;i++){
21 char c;scanf(" %c",&c);
22 int x=read();
23 if(c==‘I‘){
24 if(x>=mi) insert(root,x-ad);
25 }
26 else if(c==‘A‘) ad+=x;
27 else if(c==‘S‘){
28 ad-=x;lea+=del(root);
29 }
30 else{
31 if(tr[root].size<x) printf("-1\n");
32 else printf("%d\n",query_num(root,x));
33 }
34 }
35 printf("%d\n",lea);
36 return 0;
37 }
38 void update(int k){
39 tr[k].size=tr[tr[k].l].size+tr[tr[k].r].size+tr[k].w;
40 }
41 void lturn(int &k){
42 int t=tr[k].r;tr[k].r=tr[t].l;tr[t].l=k;
43 tr[t].size=tr[k].size;update(k);k=t;
44 }
45 void rturn(int &k){
46 int t=tr[k].l;tr[k].l=tr[t].r;tr[t].r=k;
47 tr[t].size=tr[k].size;update(k);k=t;
48 }
49 void insert(int &k,int x){
50 if(k==0){
51 k=++size;
52 tr[k].w=tr[k].size=1;tr[k].rnd=rand();tr[k].v=x;
53 return;
54 }
55 tr[k].size++;
56 if(tr[k].v==x) tr[k].w++;
57 else if(tr[k].v>x){
58 insert(tr[k].l,x);
59 if(tr[k].rnd>tr[tr[k].l].rnd) rturn(k);
60 }
61 else{
62 insert(tr[k].r,x);
63 if(tr[k].rnd>tr[tr[k].r].rnd) lturn(k);
64 }
65 }
66 int del(int &k){
67 if(k==0) return 0;
68 int t;
69 if(tr[k].v+ad<mi){
70 t=tr[tr[k].l].size+tr[k].w;k=tr[k].r;return t+del(k);
71 }
72 else{
73 t=del(tr[k].l);
74 tr[k].size-=t;
75 return t;
76 }
77 }
78 int query_num(int k,int x){
79 if(k==0) return 0;
80 if(tr[tr[k].r].size>=x) return query_num(tr[k].r,x);
81 else if(tr[tr[k].r].size+tr[k].w<x) return query_num(tr[k].l,x-tr[tr[k].r].size-tr[k].w);
82 else return tr[k].v+ad;
83 }
84 int read(){
85 int ans=0,f=1;char c=getchar();
86 while(‘0‘>c||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();}
87 while(‘0‘<=c&&c<=‘9‘)ans=ans*10+c-48,c=getchar();return ans*f;
88 }