Cod sursa(job #472820)

Utilizator dornescuvladVlad Eugen Dornescu dornescuvlad Data 26 iulie 2010 18:50:06
Problema Hotel Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.4 kb
#include <iostream>
#include <fstream>
#define nmax 100008

using namespace std;

const char iname[] = "hotel.in";
const char oname[] = "hotel.out";

ifstream fin(iname);
ofstream fout(oname);

int Arb[nmax], Lf[nmax], Rg[nmax];
int op, i, N, M, j, k, l, p, q;

void empty_hotel(int n, int left, int right, int lm, int rm)
{
	if(left == lm && right == rm)
	{
		Arb[n] = Lf[n] = Rg[n] = rm - lm + 1;
		return;
	}
	else
	{
		if(Arb[n] == 0)
		{
			Arb[2 * n] = 0, Arb[2 * n + 1] = 0;
			Lf[2 * n] = 0; Rg[2 * n + 1] = 0;
			Arb[n] = right - left + 1;
		}
		int middle = (left + right) >> 1;
		if(lm <= middle)
			empty_hotel(2 * n, left, middle, lm, min(middle, rm));
		if(rm > middle)
			empty_hotel(2 * n+ 1, middle + 1, right, max(middle + 1, lm), rm);
		Lf[n] = Lf[2 * n];
		if(Lf[2 * n] == middle - left + 1)
			Lf[n] = Lf[2 * n] + Lf[2 * n + 1];
		Rg[n] = Rg[2 * n + 1];
		if(Rg[n] == right - (middle + 1) + 1)
			Rg[n] = Rg[2 * n] + Rg[2 * n + 1];
		Arb[n] = max(Arb[2 * n], max(Arb[2 * n + 1], Lf[2 * n + 1] + Rg[2 * n]));
		Arb[n] = max(Arb[n], max(Lf[n], Rg[n]));
	}
}
		
void fill_hotel(int n, int left, int right, int lm, int rm)
{
	if(left == lm && right == rm)
	{
		Arb[n] = Lf[n] = Rg[n] = 0;
		return;
	}
	else
	{	
		int middle = (left + right) >> 1;
		if(Arb[n] == right - left + 1)
		{	
			
			Arb[2 * n] = middle - left + 1, Arb[2 * n + 1] = right - (middle + 1) + 1;
			Lf[2 * n] = middle - left + 1; Rg[2 * n + 1] = right - (middle + 1) + 1;
			Lf[2 * n + 1] = right - (middle + 1) + 1;
			Rg[2 * n] = middle - left + 1;
			Arb[n] = 0;
		}
		if(lm <= middle)
			fill_hotel(2 * n, left, middle, lm, min(middle, rm));
		if(rm > middle)
			fill_hotel(2 * n + 1, middle + 1, right, max(middle + 1, lm), rm);
		Lf[n] = Lf[2 * n];
		if(Lf[2 * n] == middle - left + 1)
			Lf[n] = Lf[2 * n] + Lf[2 * n + 1];
		Rg[n] = Rg[2 * n + 1];
		if(Rg[n] == right - (middle + 1) + 1)
			Rg[n] = Rg[2 * n] + Rg[2 * n + 1];
		Arb[n] = max(Arb[2 * n], max(Arb[2 * n + 1], Lf[2 * n + 1] + Rg[2 * n]));
		Arb[n] = max(Arb[n], max(Lf[n], Rg[n]));
	}
}

int main()
{
	fin >> N >> M;
	Arb[1] = N;
	for(i = 1; i <= M; i ++)
	{
		fin >> op;
		if(op == 1)
		{
			fin >> p >> q;
			fill_hotel(1, 1, N, p, p + q - 1);
		}
		if(op == 2)
		{
			fin >> p >> q;
			empty_hotel(1, 1, N, p, p + q - 1);
		}
		if(op == 3)
			fout << Arb[1] << "\n";
	}
	return 0;
}