Cod sursa(job #600832)

Utilizator rumburakrumburak rumburak Data 3 iulie 2011 18:01:03
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include<cstdio>

const int N = (1<<18);

struct tree
{
	int stanga,dreapta,tot;
};

int n,p,a,b;
tree t[N];

inline int maxim(int x,int y)
{
	return x>y ? x : y;
}

void update(int poz,int st,int dr,int tip)
{
	if(a<=st && dr<=b)
	{
		if(tip==1)
			t[poz].stanga=t[poz].dreapta=t[poz].tot=0;
		else
			t[poz].stanga=t[poz].dreapta=t[poz].tot=dr-st+1;
		return;
	}
	int mid=(st+dr)>>1;
	if(t[poz].tot==dr-st+1)
	{
		t[poz<<1].stanga=t[poz<<1].dreapta=t[poz<<1].tot=mid-st+1;
		t[(poz<<1)+1].stanga=t[(poz<<1)+1].dreapta=t[(poz<<1)+1].tot=dr-mid;
	}
	if(t[poz].tot==0)
	{
		t[poz<<1].stanga=t[poz<<1].dreapta=t[poz<<1].tot=0;
		t[(poz<<1)+1].stanga=t[(poz<<1)+1].dreapta=t[(poz<<1)+1].tot=0;
	}
	if(a<=mid)
		update(poz<<1,st,mid,tip);
	if(b>mid)
		update((poz<<1)+1,mid+1,dr,tip);
	t[poz].stanga=t[poz<<1].stanga;
	if(t[poz<<1].tot==mid-st+1)
		t[poz].stanga+=t[(poz<<1)+1].stanga;
	t[poz].dreapta=t[(poz<<1)+1].dreapta;
	if(t[(poz<<1)+1].tot==dr-mid)
		t[poz].dreapta+=t[poz<<1].dreapta;
	t[poz].tot=maxim(t[poz<<1].dreapta+t[(poz<<1)+1].stanga,maxim(t[poz<<1].tot,t[(poz<<1)+1].tot));
}

int main()
{
	freopen("hotel.in","r",stdin);
	freopen("hotel.out","w",stdout);
	int tip;
	scanf("%d%d",&n,&p);
	t[1].stanga=t[1].dreapta=t[1].tot=n;
	while(p--)
	{
		scanf("%d",&tip);
		if(tip==3)
		{
			printf("%d\n",t[1].tot);
			continue;
		}
		scanf("%d%d",&a,&b);
		b+=a-1;
		update(1,1,n,tip);
	}
	return 0;
}