#include<bits/stdc++.h>
using namespace std;
struct Node
{
int v;
int lc,rc;
int cnt,sz;
int rd;
}tr[1000000+10];
int cnt=-1,root=-1;
void print(int p)
{
printf("%d:%d,lc:%d,rc:%d,rand:%d,sz:%d\n",p,tr[p].v,tr[p].lc,tr[p].rc,tr[p].rd,tr[p].sz);
}
void Print(int p)
{
if(p==-1)return;
Print(tr[p].lc);
print(p);
Print(tr[p].rc);
}
int newNode(int v)
{
cnt++;
tr[cnt].v=v;
tr[cnt].lc=tr[cnt].rc=-1;
tr[cnt].cnt=tr[cnt].sz=1;
tr[cnt].rd=rand();
return cnt;
}
int Marge(int l,int r)
{
//printf("marge:%d&%d\n",l,r);
if(l==-1)return r;
if(r==-1)return l;
if(tr[l].rd>tr[r].rd)
{
tr[l].sz+=tr[r].sz;
tr[l].rc=Marge(tr[l].rc,r);
//print(l),print(r);
if(r==root)root=l;
return l;
}
else{
tr[r].sz+=tr[l].sz;
tr[r].lc=Marge(l,tr[r].lc);
//print(l),print(r);
if(l==root)root=r;
return r;
}
}
pair<int,int> Spilt(int p,int v)
{
//printf("spilt %d by %d\n",p,v);
if(p==-1)return make_pair(-1,-1);
if(v<=tr[p].v)
{
tr[p].sz-=tr[tr[p].lc].sz;
pair<int,int>t=Spilt(tr[p].lc,v);
tr[p].lc=t.second;
tr[p].sz+=tr[t.second].sz;
return make_pair(t.first,p);
}
else{
tr[p].sz-=tr[tr[p].rc].sz;
pair<int,int> t=Spilt(tr[p].rc,v);
tr[p].rc=t.first;
tr[p].sz+=tr[t.first].sz;
return make_pair(p,t.second);
}
}
void Insert(int v)
{
pair<int,int> t=Spilt(root,v);
Marge(Marge(t.first,newNode(v)),t.second);
}
int Kth(int p,int k)
{
if(p==-1)return -1;
if(tr[tr[p].rc].sz>=k)return Kth(tr[p].rc,k);
else if(k==tr[tr[p].rc].sz+1)return tr[p].v;
else return Kth(tr[p].lc,k-tr[tr[p].rc].sz-1);
}
pair<int,int> Del(int p,int a)
{
if(p==-1)return make_pair(0,-1);
if(tr[p].v<a)
{
int ans=tr[tr[p].lc].sz+1;
pair<int,int> t=Del(tr[p].rc,a);
ans+=t.first;
if(p==root)root=t.second;
return make_pair(ans,t.second);
}
else
{
pair<int,int> t=Del(tr[p].lc,a);
tr[p].lc=t.second;
return make_pair(t.first,p);
}
}
int main()
{
int n,mi,zhi=0,ans=0;
cin>>n>>mi;
//newNode(0);
for(int i=0;i<n;i++)
{
int a;
char p;
cin>>p>>a;
if(p=='I')
{
if(a>=mi)
if(cnt-ans==-1)root=newNode(a-zhi);
else Insert(a-zhi);
}
else if(p=='A')zhi+=a;
else if(p=='S')
{
zhi-=a;
ans+=Del(root,mi-zhi).first;
}
else if(p=='F')
{
int t=Kth(root,a);
if(t==-1)cout<<"-1\n";
else cout<<t+zhi<<'\n';
}
//cout<<"root:"<<root<<'\n';
//Print(root);
}
cout<<ans<<'\n';
return 0;
}
Ac#1,10pts
最好 n≤20