Cod sursa(job #318851)

Utilizator Mishu91Andrei Misarca Mishu91 Data 29 mai 2009 17:55:14
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <cstdio>

#define MAX_N 400005

#define mij ((li + lf) >> 1)
#define nst nod << 1
#define ndr nst | 1

struct arb
{
	int all, st, dr;
} A[MAX_N];

int N, P, X;
int st, dr;

inline int Max(const int &A, const int &B)
{
	return ((A) > (B))? (A) : (B);
}

void build(int nod, int li, int lf)
{
	A[nod].all = A[nod].st = A[nod].dr = lf - li + 1;
	
	if(li == lf) return;
	
	build(nst, li, mij);
	build(ndr, mij+1, lf); 
}

void update(int nod, int li, int lf)
{
	if(st <= li && lf <= dr)
	{
		if(!X)
			A[nod].all = A[nod].st = A[nod].dr = 0;
		else A[nod].all = A[nod].st = A[nod].dr = lf - li + 1;
		return;
	}
	
	if(A[nod].all == lf - li + 1)
	{
		A[nst].all = A[nst].st = A[nst].dr = mij - li + 1;
		A[ndr].all = A[ndr].st = A[ndr].dr = lf - mij;
	}

	if(A[nod].all == 0)
	{
		A[nst].all = A[nst].st = A[nst].dr = 0;
		A[ndr].all = A[ndr].st = A[ndr].dr = 0;
	}
	
	if(st <= mij) update(nst, li, mij);
	if(mij < dr)  update(ndr, mij+1, lf);
	
	A[nod].st = A[nst].st;
	A[nod].dr = A[ndr].dr;
	
	A[nod].all = Max(A[nst].all, A[ndr].all);
	A[nod].all = Max(A[nod].all, A[nst].dr + A[ndr].st);
	
	if(A[nst].st == mij - li + 1)
		A[nod].st += A[ndr].st;
	if(A[ndr].dr == lf - mij)
		A[nod].dr += A[nst].dr;
}

int main()
{
	freopen("hotel.in","rt",stdin);
	freopen("hotel.out","wt",stdout);
	
	scanf("%d %d",&N, &P);
	build(1, 1, N);
	
	while(P--)
	{
		scanf("%d",&X);
		if(X == 3) printf("%d\n",A[1].all);
		else 
		{
			int x, y;
			scanf("%d %d",&x, &y);
			st = x;
			dr = x + y - 1;
			--X;
			update(1, 1, N);
		}
	}
}