Cod sursa(job #181903)

Utilizator razvi9Jurca Razvan razvi9 Data 19 aprilie 2008 10:50:26
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.2 kb
#pragma region Top
#include<cstdio>
int n,m,i,maxim,x,y,O;
char c[100],*b;
struct AI{int left,right,middle;};
AI a[300000];
int M(int a,int b)
{
	if(a>b)
		return a;
	return b;
}
inline void readline()
{
	gets(c);
	b=c;
	while(*b==' ') ++b;
	O=*b-'0';
	++b;
	if(O==3) return;
	while(*b==' ')++b;
	x=0;
	while(*b!=' '){x=x*10+*b-'0';++b;}
	while(*b==' ')++b;
	y=0;
	while(*b>='0'&&*b<='9'){y=y*10+*b-'0';++b;}
}
#pragma endregion
void add(int poz,int st,int dr,int x,int y)
{
	if(x<=st && dr<=y)
	{
		a[poz].left=a[poz].right=a[poz].middle=0;
		return;
	}
	int mij=(st+dr)>>1,p=poz<<1;
	if(a[poz].left==dr-st+1)
	{
		a[p].left=a[p].right=a[p].middle=mij-st+1;
		a[p+1].left=a[p+1].right=a[p+1].middle=dr-mij;
	}
	if(x<=mij)
		add(p,st,mij,x,y);
	if(mij<y)
		add(p+1,mij+1,dr,x,y);

	if(!(x<=st && dr<=y))
	{	
		if(a[p].left==mij-st+1)
			a[poz].left=a[p].left+a[p+1].left;
		else
			a[poz].left=a[p].left;
		if(a[p+1].right==dr-mij)
			a[poz].right=a[p].right+a[p+1].right;
		else
			a[poz].right=a[p+1].right;
		a[poz].middle=M(M(a[p].middle,a[p+1].middle),a[p].right+a[p+1].left);
	}
}
void remove(int poz,int st,int dr,int x,int y)
{
	if(x<=st && dr<=y)
	{
		a[poz].left=a[poz].right=a[poz].middle=dr-st+1;
		return;
	}
	int mij=(st+dr)>>1,p=poz<<1;
	if(a[poz].left==0 && a[poz].middle==0 && a[poz].right==0)
	{
		a[p].left=a[p].right=a[p].middle=0;
		a[p+1].left=a[p+1].right=a[p+1].middle=0;
	}
	if(x<=mij)
		remove(p,st,mij,x,y);
	if(mij<y)
		remove(p+1,mij+1,dr,x,y);

	if(!(x<=st && dr<=y))
	{	
		if(a[p].left==mij-st+1)
			a[poz].left=a[p].left+a[p+1].left;
		else
			a[poz].left=a[p].left;
		if(a[p+1].right==dr-mij)
			a[poz].right=a[p].right+a[p+1].right;
		else
			a[poz].right=a[p+1].right;
		a[poz].middle=M(M(a[p].middle,a[p+1].middle),a[p].right+a[p+1].left);
	}
}
int main()
{
	freopen("hotel.in","r",stdin);
	freopen("hotel.out","w",stdout);
	scanf("%d %d ",&n,&m);
	a[1].left=a[1].right=a[1].middle=n;
	for(i=1;i<=m;i++){
		readline();
		switch(O){
			case 1:add(1,1,n,x,x+y-1);break;
			case 2:remove(1,1,n,x,x+y-1);break;
			case 3:printf("%d\n",M(a[1].left,M(a[1].right,a[1].middle)));break;}}
	fclose(stdout);
	return 0;

}