Cod sursa(job #939033)

Utilizator otto1Palaga Vicentiu-Octavian otto1 Data 14 aprilie 2013 19:05:55
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <fstream>
#include <algorithm>
#include <bitset>
#include <math.h>
#include <stdlib.h>
#include <assert.h>
using namespace std;

const int dim = 100005;
int N, M, tip;
int pozs, pozd, lg;
int DM[dim * 4], DS[dim * 4], DD[dim * 4];
bitset <dim * 4> U;

void update_init (int n, int st, int dr)
{
	DM[n] = DS[n] = DD[n] = dr - st + 1;
	if (st == dr)
		return;

	int m = (st + dr) >> 1;
	int f1 = n << 1;
	int f2 = f1 + 1;

	update_init (f1, st, m);
	update_init (f2, m + 1, dr);
}

void citeste ()
{
	scanf ("%d%d", &pozs, &lg);
	pozd = pozs + lg - 1;
}

void update (int n, int st, int dr)
{
	if (pozs <= st && dr <= pozd)
	{
		if (tip == 1)
			DM[n] = DS[n] = DD[n] = 0;
		if (tip == 2)
			DM[n] = DS[n] = DD[n] = dr - st + 1;
		U[n] = 1;
		return;
	}

	int m = (st + dr) >> 1;
	int f1 = n << 1;
	int f2 = f1 + 1;

	if (U[n])
	{
		U[n] = 0;
		U[f1] = U[f2] = 1;
		if (DM[n] == dr - st + 1)
		{
			DM[f1] = DS[f1] = DD[f1] = m - st + 1;
			DM[f2] = DS[f2] = DD[f2] = dr - m;
		}
		else if (DM[n] == 0)
		{
			DM[f1] = DS[f1] = DD[f1] = 0;
			DM[f2] = DS[f2] = DD[f2] = 0;
		}
		else
		{
			//printf ("ERROR\n");
			assert (0);
		}
	}

	if (m >= pozs)
		update (f1, st, m);
	if (m + 1 <= pozd)
		update (f2, m + 1, dr);

	DM[n] = max (DD[f1] + DS[f2], max (DM[f1], DM[f2]));

	DS[n] = DS[f1];
	if (DS[f1] == m - st + 1) DS[n] += DS[f2];

	DD[n] = DD[f2];
	if (DD[f2] == dr - m) DD[n] += DD[f1];
}

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

	scanf ("%d%d", &N, &M);
	update_init (1, 1, N);

	while (M --)
	{
		scanf ("%d", &tip);
		if (tip == 1)
		{
			citeste ();
			update (1, 1, N);
		}
		else if (tip == 2)
		{
			citeste ();
			update (1, 1, N);
		}
		else
		{
			printf ("%d\n", DM[1]);
		}
	}

	return 0;
}