Cod sursa(job #290488)

Utilizator toni2007Pripoae Teodor Anton toni2007 Data 27 martie 2009 23:45:04
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.65 kb
#include <cstdio>
#define maxN 100100

struct arbint {
	int l, r, libere;
} Arb[maxN * 4 + 100];

int N, start, finish;
inline int max (int a, int b) {
	if (a > b)	return a;
	return b;

}
void baga_marfa (int nod, int l, int r) {
	int NrLibere, mid, st = 2 * nod, dr = 2 * nod + 1;
	if (start <= l && r <= finish) {
		NrLibere = (r - l + 1);
		Arb[nod].l = Arb[nod].r = Arb[nod].libere = 0;
		return ;
	}
	mid = (l + r) >> 1;

	if (Arb[nod].libere == (r - l + 1)) {
		Arb[st].libere = Arb[st].l = Arb[st].r = (mid - l + 1);
		Arb[dr].libere = Arb[dr].l = Arb[dr].r = (r - mid);
	}
	if (start <= mid)
		baga_marfa(st, l, mid);
	if (mid < finish)
		baga_marfa(dr, mid + 1, r);
	Arb[nod].libere = max (max(Arb[st].libere, Arb[dr].libere), Arb[st].r + Arb[dr].l);

	if (Arb[st].l == (mid - l + 1))
		Arb[nod].l = (mid - l + 1) + Arb[dr].l;
	else
		Arb[nod].l = Arb[st].l;
	
	if (Arb[dr].r == (r - mid))
		Arb[nod].r = (r - mid) + Arb[st].r;
	else
		Arb[nod].r = Arb[dr].r;
}

void scoate_marfa (int nod, int l, int r) {
	int NrLibere, mid, st = 2 * nod, dr = 2 * nod + 1;
//	printf("Arb %d %d %d %d %d %d\n", nod, l, r, Arb[nod].libere, Arb[nod].l, Arb[nod].r);
	if (start <= l && r <= finish) {
		NrLibere = (r - l + 1);
		Arb[nod].l = Arb[nod].r = Arb[nod].libere = NrLibere;
		return ;
	}
	mid = (l + r) >> 1;
	if (Arb[nod].libere == 0) {
		Arb[st].libere = Arb[st].l = Arb[st].r = 0;
		Arb[dr].libere = Arb[dr].l = Arb[dr].r = 0;
	}
	if (start <= mid)
		scoate_marfa(st, l, mid);
	if (mid < finish)
		scoate_marfa(dr, mid + 1, r);
	Arb[nod].libere = max (max(Arb[st].libere, Arb[dr].libere), Arb[st].r + Arb[dr].l);

	if (Arb[st].l == (mid - l + 1))
		Arb[nod].l = (mid - l + 1) + Arb[dr].l;
	else
		Arb[nod].l = Arb[st].l;
	
	if (Arb[dr].r == (r - mid))
		Arb[nod].r = (r - mid) + Arb[st].r;
	else
		Arb[nod].r = Arb[dr].r;
}

void construieste (int nod ,int l, int r) {
	if (l == r) {
		Arb[nod].l = Arb[nod].r = Arb[nod].libere = 1;
		return ;
	}
	int mid, st, dr;
	mid = (l + r) >> 1; st = nod * 2, dr = nod * 2 + 1;
	construieste(st, l, mid);
	construieste(dr, mid + 1, r);
	Arb[nod].l = Arb[nod].r = Arb[nod].libere = Arb[st].l + Arb[dr].l;
}
int main () {
	int M, tip;
	
	freopen("hotel.in", "r", stdin);
	freopen("hotel.out", "w", stdout);

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

	construieste (1, 1, N);
	for ( ; M ; M --) {
		scanf("%d", &tip);
		if (tip == 3) {
			printf("%d\n", Arb[1].libere);
			continue;
		}
		scanf("%d%d", &start, &finish);
		finish += start - 1;
		if (tip == 1)
			baga_marfa(1, 1, N);
		else
			scoate_marfa(1, 1, N);
	//	printf("%d %d %d\n", Arb[1].libere, Arb[1].l, Arb[1].r);
	//	printf("%d %d %d %d %d %d\n",Arb[2].libere, Arb[2].l, Arb[2].r, Arb[3].libere, Arb[3].l, Arb[3].r);
	}
}