记录编号 360703 评测结果 AAAAAAAAAA
题目名称 [NOI 2004]郁闷的出纳员 最终得分 100
用户昵称 GravatarGo灬Fire 是否通过 通过
代码语言 C++ 运行时间 0.419 s
提交时间 2016-12-31 11:39:02 内存使用 7.15 MiB
显示代码纯文本
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=100000*5;
int ls[maxn],rs[maxn],size[maxn],v[maxn],RT,cnt;
int n,Least,Plus;
void pushup(int rt){size[rt]=size[ls[rt]]+size[rs[rt]]+1;}
void Turn_left(int & rt){
	int t=rs[rt];
	rs[rt]=ls[t];pushup(rt);
	ls[t]=rt;pushup(t);
	rt=t;
}
void Turn_right(int & rt){
	int t=ls[rt];
	ls[rt]=rs[t];pushup(rt);
	rs[t]=rt;pushup(t);
	rt=t;
}
#define Balance_all Balance(ls[rt]);Balance(rs[rt]);Balance(rt);
void Balance(int & rt){
	if(size[ls[ls[rt]]]>size[rs[rt]]){
		Turn_right(rt);Balance_all;
		return;
	}
	if(size[rs[rs[rt]]]>size[ls[rt]]){
		Turn_left(rt);Balance_all;
		return;
	}
	if(size[rs[ls[rt]]]>size[rs[rt]]){
		Turn_left(ls[rt]);Turn_right(rt);Balance_all;
		return;
	}
	if(size[ls[rs[rt]]]>size[ls[rt]]){
		Turn_right(rs[rt]);Turn_left(rt);Balance_all;
		return;
	}
}
#undef Balance_all
void Insert(int & rt,int date){
	if(rt==0){
		rt=++cnt;size[rt]=1;v[rt]=date;
		return;
	}
	if(date<v[rt])Insert(ls[rt],date);
	else Insert(rs[rt],date);
	pushup(rt);
	Balance(rt);
}
int Del(int & rt){
	if(!rt)return 0;
	int tot=0;
	if(v[rt]+Plus<Least){
		tot+=size[ls[rt]]+1;size[rt]-=tot;ls[rt]=0;
		int num=Del(rs[rt]);tot+=num;size[rt]-=num;
		size[rs[rt]]=size[rt];rt=rs[rt];
		Balance(rt);
	}
	else {
		tot=Del(ls[rt]);size[rt]-=tot;
		Balance(rt);
	}
	return tot;
}
int Get_date(int rt,int th){
	if(size[rs[rt]]+1==th)return v[rt];
	if(size[rs[rt]]+1>th)return Get_date(rs[rt],th);
	else return Get_date(ls[rt],th-size[rs[rt]]-1);
}
void Init();
int main(){
    freopen("cashier.in","r",stdin);freopen("cashier.out","w",stdout);
    Init();
    getchar();getchar();
    return 0;
}
void Init(){
	scanf("%d%d",&n,&Least);int ans=0;
	for(int i=1;i<=n;i++){
		char type;int date;scanf(" %c%d",&type,&date);
		if(type=='I'){
			if(date<Least)continue;
			Insert(RT,date-Plus);
		}
		else if(type=='A')Plus+=date;
		else if(type=='S'){
			Plus-=date;ans+=Del(RT);
		}
		else if(type=='F'){
			if(size[RT]<date)puts("-1");
			else printf("%d\n",Get_date(RT,date)+Plus);
		}
	} 
	printf("%d\n",ans);
}