Cod sursa(job #459267)

Utilizator andrei.dAndrei Diaconeasa andrei.d Data 28 mai 2010 19:20:17
Problema Hotel Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <cstdio>

#define file_in "hotel.in"
#define file_out "hotel.out"

#define nmax 601001

int n,m;
int a,b,tip;
struct arbint
{
	int st,dr,sum;
}
ai[nmax];

void citire()
{
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	scanf("%d %d", &n, &m);
}

void build(int nod, int ls, int ld)
{
	int mij=(ls+ld)>>1;
	
	ai[nod].dr=ai[nod].st=ai[nod].sum=ld-ls+1;
	if (ls==ld)
		return ;
	build(2*nod,ls,mij);
	build(2*nod+1,mij+1,ld);
}

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

void update(int nod, int ls, int ld)
{
	int mij=(ls+ld)>>1;
	if (a<=ls && ld<=b)
	{
		if (tip==1)
			ai[nod].st=ai[nod].dr=ai[nod].sum=0;
		else
			ai[nod].st=ai[nod].dr=ai[nod].sum=ld-ls+1;
		return ;
	}
	if (tip==1 && ai[nod].sum==ls-ld+1)
	{
		ai[2*nod].sum=ai[2*nod].dr=ai[2*nod].st=mij-ls+1;
		ai[2*nod+1].sum=ai[2*nod+1].dr=ai[2*nod+1].st=ld-mij;
	}
	if (tip==2 && ai[nod].sum==0)
	{
		ai[2*nod].sum=ai[2*nod].dr=ai[2*nod].st=0;
		ai[2*nod+1].sum=ai[2*nod+1].dr=ai[2*nod+1].st=0;
	}
	
	if (a<=mij)
		update(2*nod,ls,mij);
	if (mij<b)
		update(2*nod+1,mij+1,ld);
	if (ai[2*nod].sum==mij-ls+1)
	    ai[nod].st=ai[2*nod].sum+ai[2*nod+1].st;
	else
		ai[nod].st=ai[2*nod].st;
	if (ai[2*nod+1].sum==ld-mij)
	    ai[nod].dr=ai[2*nod].dr+ai[2*nod+1].sum;
	else
		ai[nod].dr=ai[2*nod+1].dr;
	ai[nod].sum=ai[2*nod+1].st+ai[2*nod].dr;
	ai[nod].sum=max(ai[nod].sum,ai[nod].dr);
	ai[nod].sum=max(ai[nod].sum,ai[nod].st);
	ai[nod].sum=max(ai[2*nod].sum,ai[nod].sum);
	ai[nod].sum=max(ai[2*nod+1].sum,ai[nod].sum);
	

}


void solve()
{
	build(1,1,n);
	while(m--)
	{
		scanf("%d", &tip);
		if (tip==1 || tip==2)
		{
			scanf("%d %d", &a, &b);
			b+=(a-1);
			update(1,1,n);
		}
		else
			printf("%d\n", ai[1].sum);
	}
}


int main()
{
	citire();
	solve();
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
	
}