Cod sursa(job #518934)

Utilizator blastoiseZ.Z.Daniel blastoise Data 3 ianuarie 2011 15:59:38
Problema Hotel Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <stdio.h>

struct tree
{
	int Q,L,R;
}T[262144];

int N,P,x,y,aux,i,c;

inline int max(int a,int b)
{
	if(a>b) return a;
	else return b;
}

inline void update(int nod,int L,int R)
{
	int M=(L+R)/2;

	if(x<=L&&R<=y)
	{
		if(c==2) T[nod].Q=T[nod].L=T[nod].R=R-L+1;
		else T[nod].Q=T[nod].L=T[nod].R=0;
	}
	else
	{
		if(T[nod].Q==R-L+1)
		{
			T[2*nod].Q=T[2*nod].L=T[2*nod].R=M-L+1;
			T[2*nod+1].Q=T[2*nod+1].L=T[2*nod+1].R=R-M;
		}
		if(x<=M) update(2*nod,L,M);
		if(M<y) update(2*nod+1,M+1,R);
		T[nod].L=T[2*nod].L;
		if(T[nod].L==M-L+1) T[nod].L+=T[2*nod+1].L;
		T[nod].R=T[2*nod+1].R;
		if(T[nod].R==R-M) T[nod].R+=T[2*nod].R;
		T[nod].Q=max(T[2*nod].Q,T[2*nod+1].Q);
		T[nod].Q=max(T[nod].Q,T[2*nod].R+T[2*nod+1].L);
	}
}

int main()
{
	freopen("hotel.in","r",stdin);
	freopen("hotel.out","w",stdout);

	scanf("%d%d",&N,&P);

	T[1].L=T[1].R=T[1].Q=N;

	for(i=1;i<=P;i++)
	{
		scanf("%d",&c);
		if(c==3) printf("%d\n",T[1].Q);
		else
		{
			scanf("%d%d",&x,&aux);
			y=aux+x-1;
			update(1,1,N);
		}
	}

	return 0;
}