#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=3e7+5,INF=1e11+5;
int n,minn,root,idx,ans;
struct node{
int s[2],w,f;
int size,cnt;
void init(int _w,int _f)
{
w=_w;
f=_f;
size=1;
cnt=1;
}
}tree[N];
int read()
{
int x=0,f=1;
char c=getchar();
while (c<'0'||c>'9')
{
if (c=='-')
f=-1;
c=getchar();
}
while (c>='0'&&c<='9')
{
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
void push_up(int x)
{
tree[x].size=tree[tree[x].s[0]].size+tree[tree[x].s[1]].size+tree[x].cnt;
}
void rotate(int x)
{
int y=tree[x].f;
int z=tree[y].f;
int k=tree[y].s[1]==x;
tree[z].s[tree[z].s[1]==y]=x;
tree[x].f=z;
tree[y].s[k]=tree[x].s[k^1];
tree[tree[x].s[k^1]].f=y;
tree[x].s[k^1]=y;
tree[y].f=x;
push_up(y);
push_up(x);
}
void splay(int x,int k)
{
while (tree[x].f!=k)
{
int y=tree[x].f;
int z=tree[y].f;
if (z!=k)
{
if ((tree[y].s[1]==x)^(tree[z].s[1]==y))
rotate(x);
else
rotate(y);
}
rotate(x);
}
if (!k)
root=x;
}
void insert(int x)
{
if (x<minn)
return ;
int u=root;
int f=0;
while (u&&x!=tree[u].w)
{
f=u;
u=tree[u].s[x>tree[u].w];
}
if (u)
tree[u].cnt++;
else
{
u=++idx;
if (f)
tree[f].s[x>tree[f].w]=u;
tree[u].init(x,f);
}
splay(u,0);
}
void find(int x)
{
int u=root;
if (!u)
return ;
while(tree[u].s[x>tree[u].w]&&x!=tree[u].w)
u=tree[u].s[x>tree[u].w];
splay(u,0);
}
int get_next(int x,int f)
{
find(x);
int u=root;
if (tree[u].w>x&&f)
return u;
if (tree[u].w<x&&!f)
return u;
u=tree[u].s[f];
while(tree[u].s[f^1])
u=tree[u].s[f^1];
return u;
}
int get_w(int k)
{
int u=root;
if (tree[u].size<k)
return -1;
while(1)
{
if (k>tree[tree[u].s[1]].size+tree[u].cnt)
{
k-=tree[tree[u].s[1]].size+tree[u].cnt;
u=tree[u].s[0];
}
else
{
if (tree[tree[u].s[1]].size>=k&&tree[u].s[1])
u=tree[u].s[1];
else
{
splay(u,0);
return tree[u].w;
}
}
}
}
char opt;
int k;
signed main()
{
n=read(),minn=read();
insert(INF);
for (int qwq=1;qwq<=n;qwq++)
{
opt=getchar();
k=read();
if (opt=='I')
insert(k);
else if (opt=='A')
{
for (int i=1;i<=idx;i++)
tree[i].w+=k;
}
else if (opt=='S')
{
for (int i=1;i<=idx;i++)
tree[i].w-=k;
int ovo=get_next(minn-1,1);
splay(ovo,0);
ans+=tree[tree[root].s[0]].size;
tree[root].s[0]=0;
push_up(root);
}
else if (opt=='F')
cout <<get_w(k+1)<<endl;
}
cout <<ans<<endl;
return 0;
}
样例和下载的测试点都过了,但显示的是读到了0,大佬们求条