Cod sursa(job #505351)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 1 decembrie 2010 21:06:41
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <cstdio>
#define nmax 400000

int n, p, v[nmax], l[nmax], r[nmax], st, dr;

void update(int nod, int a, int b, int c)
{
	if (st<=a && b<=dr) 
	{
		if (c==1) l[nod]=r[nod]=v[nod]=0; else
			l[nod]=r[nod]=v[nod]=b-a+1;
	} else
	{	
		int m=(a+b)/2;
		if (!v[nod]) v[2*nod]=v[2*nod+1]=l[2*nod]=l[2*nod+1]=r[2*nod]=r[2*nod+1]=0; else
			if (v[nod]==b-a+1)
			{
				v[2*nod]=l[2*nod]=r[2*nod]=m-a+1;
				v[2*nod+1]=l[2*nod+1]=r[2*nod+1]=b-m;
			}
		if (st<=m) update(2*nod, a, m, c);
		if (m<dr) update(2*nod+1, m+1, b, c);
		l[nod]=l[2*nod];
		if (l[nod]==m-a+1) l[nod]+=l[2*nod+1];
		r[nod]=r[2*nod+1];
		if (r[nod]==b-m) r[nod]+=r[2*nod];
		v[nod]=r[2*nod]+l[2*nod+1];
		if (v[2*nod]>v[nod]) v[nod]=v[2*nod];
		if (v[2*nod+1]>v[nod]) v[nod]=v[2*nod+1];
	}
}

int main()
{
	freopen("hotel.in","r",stdin);
	freopen("hotel.out","w",stdout);
	scanf("%d %d",&n,&p);
	int c, i;
	v[1]=l[1]=r[1]=n;
	while (p--)
	{
		scanf("%d",&c);
		if (c==1)
		{
			scanf("%d %d",&st,&dr);
			dr+=st-1;
			update(1, 1, n, 1);
		} else
		if (c==2)
		{
			scanf("%d %d",&st, &dr);
			dr+=st-1;
			update(1, 1, n, 2);
		}  else 
			printf("%d\n",v[1]);
	}
}