Cod sursa(job #447877)

Utilizator ooctavTuchila Octavian ooctav Data 1 mai 2010 18:16:45
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include<cstdio>
#include<iostream>
using namespace std;

const int NMAX = 100010;
const int ARBMAX = 1<<18;
struct arbore
{
	int sir, p, q;

} Arb[ARBMAX];
//int viz[NMAX];
int iden, x, y;
int N, P;

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

void update(int nod, int st, int dr)
{
	if( x <= st && dr <= y)
	{
		if(iden == 1)
			Arb[nod].sir = Arb[nod].p = Arb[nod].q = 0;
		if(iden == 2)
			Arb[nod].sir = Arb[nod].p = Arb[nod].q = dr - st + 1;
		return;
	}
	
	int mij = (st + dr)/2;
	
	if(Arb[nod].sir == 0)
	{
		Arb[2*nod].sir = Arb[2*nod].p = Arb[2*nod].q = 0;
		Arb[2*nod + 1].sir = Arb[2*nod + 1].p = Arb[2*nod + 1].q = 0;
	}
	if(Arb[nod].sir == dr - st + 1)
	{
		Arb[2*nod].sir = Arb[2*nod].p = Arb[2*nod].q = mij - st + 1;
		Arb[2*nod + 1].sir = Arb[2*nod + 1].p = Arb[2*nod + 1].q = dr - (mij + 1) + 1;
	}
	
	if(x <= mij)
		update(2 * nod, st, mij);
	if(y >= mij+1)
		update(2 * nod + 1, mij + 1, dr);
	
	Arb[nod].sir = max(Arb[2 * nod].sir, Arb[2 * nod].q + Arb[2 * nod + 1].p, Arb[2 * nod + 1].sir);
	
	if(Arb[2 * nod].sir == mij - st + 1)
		Arb[nod].p = Arb[2 * nod].p + Arb[2 * nod + 1].p;
	else
		Arb[nod].p = Arb[2 * nod].p;
	
	if(Arb[2 * nod + 1].sir == dr - (mij + 1) + 1)
		Arb[nod].q = Arb[2 * nod].q + Arb[2 * nod + 1].q;
	else
		Arb[nod].q = Arb[2 * nod + 1].q;
}

void citire()
{
	cin >> N >> P;
	Arb[1].sir = Arb[1].p = Arb[1].q = N;
	for(int i = 1 ; i <= P ; i++)
	{
		cin >> iden;
		if(iden < 3)
		{
			cin >> x >> y;
			y += x - 1;
			update(1, 1, N);
		}
		else
			cout << Arb[1].sir << '\n';
	}
}

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