记录编号 176782 评测结果 AAAAAAAAAA
题目名称 [NOI 2004]郁闷的出纳员 最终得分 100
用户昵称 Gravatar/k 是否通过 通过
代码语言 C++ 运行时间 0.582 s
提交时间 2015-08-09 20:32:47 内存使用 2.09 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
struct u
{
	int z;
	int y;
	int zz;
	int rk;
	int d;
	int s;
}c[100000+10];
int f[100000+10],rr,n,m,rt,p,gd,dm,mn;
/****************************************************************/
void gy(int x)
{   
	c[0].s=0;
	int y=f[x];
	if(c[x].s+c[y].d+c[c[y].y].s!=c[y].s)
		printf("&&&&&&&&&&&&&**************************&&&&&&&&&&&&&&&&&&&&&&&&");
	int uuu=c[y].s;
	/*if(p==3)
		printf("\nuuuu%duuu\n",uuu);*/
	if(f[y]!=0)
	{
		if(c[f[y]].z==y)
			c[f[y]].z=x;
		else
			c[f[y]].y=x;
	}
	f[x]=f[y];
	if(y==rt)
	{	
		rt=x;
		f[x]=0;
	}
	//c[x].s+=c[c[y].y].s+c[y].d;
	//c[y].s-=c[c[x].z].s+c[x].d;
	c[0].s=c[0].d=0;
	f[y]=x;
	if(c[y].z!=0)
		c[y].z=c[x].y;
	if(c[x].y!=0)
		f[c[x].y]=y;
	c[x].y=y;
	c[y].s=c[y].d+c[c[y].z].s+c[c[y].y].s;
	c[x].s=c[x].d+c[c[x].z].s+c[c[x].y].s;
	if(c[x].s!=uuu)
		printf("SDFGDFGDSFGDFSGDSFGDSF!!!!!!!!!!!!!!!!!!!!\n");
}
void gz(int y)
{
	int x=f[y];
	if(f[x]!=0)
	{
		if(c[f[x]].z==x)
			c[f[x]].z=y;
		else
			c[f[x]].y=y;
	}
	f[y]=f[x];
	if(x==rt)
	{
		rt=y;
		f[y]=0;
	}
	f[x]=y;
	c[0].s=c[0].d=0;
	//c[x].s-=c[c[y].y].s+c[y].d;
	//c[y].s+=c[c[x].z].s+c[x].d;
	c[x].y=c[y].z;
	f[c[x].y]=x;
	c[y].z=x;
	c[x].s=c[x].d+c[c[x].z].s+c[c[x].y].s;
	c[y].s=c[y].d+c[c[y].z].s+c[c[y].y].s;
}
//**********************************************9**********************/
void gch(int x,int k)
{
	//printf("ch");
	c[x].s++;
	if(k==c[x].zz+dm)
	{
		c[x].d++;
		p=0;
		return ;
	}
	if(k<c[x].zz+dm)
	{
		if(c[x].z==0)
		{
			c[x].z=++n;
			c[n].zz=k-dm;
			f[n]=x;
			c[n].s=1;
			c[n].d=1;
			c[n].rk=rand();
			p=n;
			return ;
		}
		else
			gch(c[x].z,k);
	}
	if(k>c[x].zz+dm)
	{
		if(c[x].y==0)
		{
			c[x].y=++n;
			c[n].zz=k-dm;
			f[n]=x;
			c[n].d=1;
			c[n].s=1;
			c[n].rk=rand();
			p=n;
			return ;
		}	
		else
			gch(c[x].y,k);
	}
	return ;
}
void grk(int a)
{
	//printf("rk");
	c[0].s=0;
	int p=0;
	if(c[a].s==c[a].d+c[c[a].z].s+c[c[a].y].s)
		p=1;
		//printf("wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww");
	if(a==rt||c[a].rk>=c[f[a]].rk)
		return ;
	//printf("klj\n\n\n");
	//printf("GFGDf");
	if(c[f[a]].z==a)
	{
		if(f[a]==rt)
		{
			gy(a);
			rt=a;
			f[a]=0;
			return ;
		}
		gy(a);
		grk(a);
			///////////////////
	if(c[a].s!=c[a].d+c[c[a].z].s+c[c[a].y].s)
		p++;
	//	if(p==2)
	//	printf("wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww");
		///////////////////////
		return;
	}	
	if(c[f[a]].y==a)
	{
		if(f[a]==rt)
		{
			gz(a);
			rt=a;
			f[a]=0;
			return ;
		}
		gz(a);
		grk(a);
	}	
}
int gdl(int a)
{
	if(a==0)
	{
		return 0;
	}
	int u=0;
	if(c[a].zz+dm<mn)
	{
		if(c[a].z!=0)
			u+=c[c[a].z].s;
		u+=c[a].d;
		rr-=u;
		gd+=u;
		if(rt==a)
		{
			rt=c[a].y;
		}
		if(c[a].y!=0)
			f[c[a].y]=f[a];
		if(f[a]!=0)
		{
			if(c[f[a]].z==a)
				c[f[a]].z=c[a].y;
			else
				c[f[a]].y=c[a].y;
		}
		if(c[a].y!=0)
			u+=gdl(c[a].y);
		f[a]=c[a].z=c[a].y=c[a].zz=c[a].s=0;
		return u;
	}
	if(c[a].z!=0)
	{
		u+=gdl(c[a].z);
	}
	c[a].s-=u;
	return u;
}
void gw(int h,int k)
{
	//printf("w");
	c[0].s=0;
	/*if(c[h].s!=c[c[h].z].s+c[c[h].y].s+c[h].d)
			printf("wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\n");*/
	if(h==0)
		return;
	int u=0;
	if(c[h].y!=0)
	{
		u+=c[c[h].y].s;
	}
	if(k<=u)
	{	
		gw(c[h].y,k);
		return;
	}
	if(u+c[h].d>=k)
	{
		printf("%d\n",c[h].zz+dm);
		return;
	}
	if(c[h].z!=0)
	if(u+c[h].d<k&&k<=u+c[h].d+c[c[h].z].s)
	{
		gw(c[h].z,k-u-c[h].d);
		return;
	}
	printf("DF\n");	
}
bool gff(int a)
{
	while(f[a]!=0)
		a=f[a];
	if(a==rt)
		return 1;
		return 0;
}
void gt()
{
	printf("\n%d\n",rt);
	printf("i z y zz rk s f\n");
	for(int i=1;i<=n;i++)
	{
		if(gff(i))
			printf("%d %d %d %d %d %d %d\n",i,c[i].z,c[i].y,c[i].zz+dm,c[i].rk,c[i].s,f[i]);
	}
}
int main()
{
	freopen("cashier.in","r",stdin);
	freopen("cashier.out","w",stdout);
	scanf("%d%d",&m,&mn);
	//printf("%d %d\n",m,mn);
	//lmin=mn;
	char ml[10];
	for(int i=1;i<=m;i++)
	{
		int k;
		scanf("%s%d",ml,&k);
		//printf("%c %d\n",ml[0],k);
		if(ml[0]=='I')
		{
			if(k>=mn)
			{
				++rr;  //人数++ 
				if(rt==0)
				{
					c[++n].zz=k-dm;
					c[n].rk=rand();
					rt=n;
					c[n].d=c[n].s=1;  
				}
				else
				{
					gch(rt,k);
					//printf("GF%d",p);
					if(p!=0)
						grk(p);
						//if(p==3)
					//		printf("GDFGDFG\n");
				}		
			}
			//continue;
		}
		if(ml[0]=='A')
		{
			dm+=k;
			//continue;
		}
		if(ml[0]=='S')
		{
			dm-=k;
			if(rt!=0)
				gdl(rt);
			//continue;
		}
		if(ml[0]=='F')
		{
			if(rr<k)
				printf("-1\n");
			else
				gw(rt,k);
		}
		//gt();
	}
	printf("%d",gd);
	//while(1);
}