Cod sursa(job #409388)

Utilizator GheorgheMihaiMihai Gheorghe GheorgheMihai Data 3 martie 2010 17:08:53
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include<stdio.h>
struct arbore
{
	int max,st,dr;
};
int n,nrq,x,y;
arbore v[1<<18];

inline int max(int a, int b){return a>b?a:b;}

void update(int nod, int st, int dr, int t)
{
	int m=(st+dr)>>1,left=(nod<<1),right=left|1;
	if(t==1)
	{
		if(x<=st && dr<=y)
		{
			v[nod].max=v[nod].st=v[nod].dr=0;
			return;
		}
		if(v[nod].max==dr-st+1)
		{
			v[left].max=v[left].st=v[left].dr=m-st+1;
			v[right].max=v[right].st=v[right].dr=dr-m;
		}
	}
	else
	{
		if(x<=st && dr<=y)
		{
			v[nod].max=v[nod].st=v[nod].dr=dr-st+1;
			return;
		}
		if(v[nod].max==0)
		{
			v[left].max=v[left].st=v[left].dr=0;
			v[right].max=v[right].st=v[right].dr=0;
		}
	}

	if(x<=m)
		update(left,st,m,t);
	if(m<y)
		update(right,m+1,dr,t);

	v[nod].max=max(v[left].max,v[right].max);
	v[nod].max=max(v[nod].max,v[left].dr+v[right].st);

	v[nod].st=v[left].st;
	if(v[left].max==m-st+1)
		v[nod].st=v[left].max+v[right].st;

	v[nod].dr=v[right].dr;
	if(v[right].dr==dr-m)
		v[nod].dr=v[right].max+v[left].dr;
}

int main()
{
	freopen("hotel.in","r",stdin);
	freopen("hotel.out","w",stdout);
	scanf("%d%d",&n,&nrq);
	x=1;
	y=n;
	update(1,1,n,2);
	int i,t;
	for(i=1;i<=nrq;i++)
	{
		scanf("%d",&t);
		if(t==3)
			printf("%d\n",v[1].max);
		else
		{
			scanf("%d%d",&x,&y);
			y=y+x-1;
			update(1,1,n,t);
		}
	}
	return 0;
}