Cod sursa(job #733447)

Utilizator eukristianCristian L. eukristian Data 12 aprilie 2012 11:38:54
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <cstdio>
#include <cassert>

#define TREE_SIZE 262145

int n, p, crt[TREE_SIZE], beg[TREE_SIZE], end[TREE_SIZE];

int st, dr, act;

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

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

void build(int node, int left, int right);
void update(int node, int left, int right);

int main()
{
	assert(freopen("hotel.in", "r", stdin));
	assert(freopen("hotel.out","w",stdout));
	
	assert(scanf("%d %d", &n, &p));
	build(1, 1, n);
	
	for (int i = 1 ; i <= p ; ++i)
	{
		scanf("%d", &act);
		
		if (act == 1 || act == 2)
		{
			scanf("%d %d", &st, &dr);
			dr = st + dr - 1;
			update(1, 1, n);

		}
		else
			printf("%d\n", crt[1]);
	}
	
	return 0;
}

void build(int node, int left, int right)
{
	crt[node] = beg[node] = end[node] = right - left + 1;
	if (left != right)
	{
		int midp = (left + right) >> 1;
		build(node << 1, left, midp);
		build((node << 1) + 1, midp + 1, right);
	}
}

void update(int node, int left, int right)
{
	if (st <= left && right <= dr)
	{
		int value = 0;
		if (act == 2)
			value = right - left + 1;
		
		crt[node] = beg[node] = end[node] = value;
		return;
	}
	
	int midp = (left + right) >> 1;
	
	if (crt[node] == right - left + 1)
	{
		crt[node << 1] = beg[node << 1] = end[node << 1] = midp - left + 1;
		crt[(node << 1) + 1] = beg[(node << 1) + 1] = end[(node << 1) + 1] = right - midp;
	}
	else if (crt[node] == 0)
	{
		crt[node << 1] = beg[node << 1] = end[node << 1] = 0;
		crt[(node << 1) + 1] = beg[(node << 1) + 1] = end[(node << 1) + 1] = 0;
	}
	
	if (st <= midp)
		update(node << 1, left, midp);
	if (dr > midp)
		update((node << 1) + 1, midp + 1, right);
	
	crt[node] = max(crt[node << 1], crt[(node << 1)	+ 1], end[node << 1] + beg[(node << 1)	+ 1]);
	beg[node] = beg[node << 1];
	if (beg[node] == midp - left + 1)
		beg[node] += beg[(node << 1) + 1];
	
	end[node] = end[(node << 1) + 1];
	if (end[node] == right - midp)
		end[node] += end[node << 1];
}