Cod sursa(job #543924)

Utilizator mathboyDragos-Alin Rotaru mathboy Data 28 februarie 2011 19:19:25
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <cstdio>
#include <string>
#include <cstring>

#define fs (nod << 1)
#define fd ((nod << 1) + 1)
#define mid ((st + dr) >> 1)
#define maxn 400050

using namespace std;


int A[maxn], B[maxn], C[maxn];

void build (int nod, int st, int dr)
{
	if (st == dr) {
		A[nod] = B[nod] = C[nod] = 1;
		return ;
	}
	
	build (fs, st, mid);
	build (fd, mid + 1, dr);
	
	A[nod] = B[nod] = C[nod] = dr - st + 1;
}

void update (int nod, int st, int dr, int a, int b, int op)
{	
	//a st dr b
	if (a <= st && b >= dr) {
		if (op == 1) A[nod] = B[nod] = C[nod] = 0;
		else A[nod] = B[nod] = C[nod] = dr - st + 1;
		return ;
	}
	
	if (A[nod] == 0)
	{
		A[fs] = B[fs] = C[fs] = 0;
		A[fd] = B[fd] = C[fd] = 0;
	}
	if (A[nod] == dr - st + 1)
	{
		A[fs] = B[fs] = C[fs] = mid - st + 1;
		A[fd] = B[fd] = C[fd] = dr - mid;
	}

	
	if (a <= mid) update (fs, st, mid, a, b, op);
	if (b > mid) update (fd, mid + 1, dr, a, b, op);
	

	
	B[nod] = B[fs];
	C[nod] = C[fd];
	
	if (B[fs] == mid - st + 1) B[nod] += B[fd];
	if (C[fd] == dr - mid) C[nod] += C[fs];
	
	A[nod] = max (B[nod], C[nod]);
	A[nod] = max (A[nod], max (A[fs], max (A[fd], C[fs] + B[fd])));
	
}
int main ()
{
	
	freopen ("hotel.in", "r", stdin);
	freopen ("hotel.out", "w", stdout);
	
	int n, m, op, x, y;
	scanf ("%d %d\n", &n, &m);
	
	build (1, 1, n);
	
	while (m--)
	{
		
		scanf ("%d", &op);
		if (op == 1 || op == 2) 
		{
			scanf ("%d %d\n", &x, &y);
			update (1, 1, n, x, x + y - 1, op);
		}
		else printf ("%d\n", A[1]);
	}
	return 0;
}