rt,真的要瞎了
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<sstream>
#include<queue>
//#include<map>
#include<vector>
#include<math.h>
using namespace std;
//#define int long long
#define forr(i,a,b) for(int i=a;i<=b;i++)
#define repp(i,a,b) for(int i=a;i>=b;i--)
#define INF 1e9
#define ll long long
#define MAXN 200005
const int _x[]={0,1,0,-1,0},_y[]={0,0,1,0,-1};
#define mem(a,n) memset(a,n,sizeof(a));
#define chkmax(a,b) a=a>b?a:b;
#define chkmin(a,b) a=a<b?a:b;
#include<set>
#include<stack>
#define DE puts("check");
#define int long long
//int l,r,p;
struct FTree{
int ch[2];
int val,rad;
int size;
};
FTree tree[MAXN];
int tot;
#define lc tree[i].ch[0]
#define rc tree[i].ch[1]
void update(int i){
tree[i].size=tree[lc].size+tree[rc].size+1;
}
int addnode(int val){
tree[++tot].size=1;
tree[tot].val=val;
tree[tot].rad=rand();
return tot;
}
int merge(int l,int r){
if(!l||!r){
return l|r;
}
if(tree[l].rad<tree[r].rad){
tree[l].ch[1]=merge(tree[l].ch[1],r);
update(l);
return l;
}
tree[r].ch[0]=merge(l,tree[r].ch[0]);
}
void split(int i,int k,int &l,int &r){
if(!i){
l=r=0;
update(i);
return;
}
if(tree[i].val<=k){
l=i;
split(tree[l].ch[1],k,tree[l].ch[1],r);
update(i);
return;
}
r=i;
split(tree[r].ch[0],k,l,tree[r].ch[0]);
}
int findval(int i,int k){
forr(i,0,INF){
if(k<=tree[lc].size){
i=lc;
}
else if(k==tree[lc].size+1){
return i;
}
else{
k-=tree[lc].size+1;
i=rc;
}
}
}
int n,lowt;
int root,l,r,p;
int mon,ans;
//Tree tree;
signed main(){
srand(1145141919810);
scanf("%d%d",&n,&lowt);
forr(i,1,n){
char ch;
int x;
scanf("%s%d",&ch,&x);
switch(ch){
case 'I':{
if(x<lowt){
break;
}
x-=mon;
split(root,x,l,r);
root=merge(l,merge(addnode(x),r));
break;
}
case 'A':{
mon+=x;
break;
}
case 'S':{
mon-=x;
split(root,lowt-mon-1,l,r);
root=r;
ans+=tree[l].size;
break;
}
case 'F':{
if(tree[root].size<x){
puts("-1");
}
else{
printf("%d\n",tree[findval(root,tree[root].size-x+1)].val+mon);
}
break;
}
}
}
printf("%d\n",ans);
}