Cod sursa(job #290885)

Utilizator savimSerban Andrei Stan savim Data 28 martie 2009 21:41:37
Problema Hotel Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.46 kb
#include <stdio.h>
#include <algorithm>

using namespace std;

#define MAX_N 131072

int n, p, q, i, m, t, p2, tip;
struct arbore {
	int nr;
	int st;
	int dr;
	int Mx;
} Arb[4 * MAX_N];

void get_arb_nod(int nod, int st, int dr) {
	//calculez Arb[nod].st si Arb[nod].dr
	if (Arb[nod * 2].Mx == Arb[nod * 2].nr) Arb[nod].st = Arb[nod * 2].Mx + Arb[nod * 2 + 1].st;
	else Arb[nod].st = Arb[nod * 2].st;
	
	if (Arb[nod * 2 + 1].Mx == Arb[nod * 2 + 1].nr) Arb[nod].dr = Arb[nod * 2 + 1].Mx + Arb[nod * 2].dr;
	else Arb[nod].dr = Arb[nod * 2 + 1].dr;
	
	Arb[nod].Mx = Arb[nod * 2].dr + Arb[nod * 2 + 1].st;
	Arb[nod].Mx = max(Arb[nod].Mx, Arb[nod * 2].Mx);
	Arb[nod].Mx = max(Arb[nod].Mx, Arb[nod * 2 + 1].Mx);
	Arb[nod].Mx = max(Arb[nod].Mx, Arb[nod].st);
	Arb[nod].Mx = max(Arb[nod].Mx, Arb[nod].dr);
}

void arb_init(int nod, int st, int dr) {
	if (st != dr) {
		arb_init(nod * 2, st, (st + dr) / 2);
		arb_init(nod * 2 + 1, (st + dr) / 2 + 1, dr);
	
		Arb[nod].nr = Arb[nod * 2].nr + Arb[nod * 2 + 1].nr;
		get_arb_nod(nod, st, dr);
	}
	else
		if (dr <= n) Arb[nod].st = Arb[nod].dr = Arb[nod].Mx = Arb[nod].nr = 1;
}

void update(int nod, int st, int dr, int val) {
	if (st > q || dr < p) return;
		
	if (p <= st && dr <= q) {
		if (val == 1) Arb[nod].Mx = Arb[nod].st = Arb[nod].dr = 0;
		else Arb[nod].Mx = Arb[nod].st = Arb[nod].dr = Arb[nod].nr;
	}
	else {
		if (Arb[nod].st == Arb[nod].dr && Arb[nod].dr == Arb[nod].Mx && (Arb[nod].st == 0 || Arb[nod].st == Arb[nod].nr)) {
			if (Arb[nod].st == 0) {
				Arb[nod * 2].st = Arb[nod * 2 + 1].st = 0; 
				Arb[nod * 2].dr = Arb[nod * 2 + 1].dr = 0; 
				Arb[nod * 2].Mx = Arb[nod * 2 + 1].Mx = 0; 
			}
			else {
				Arb[nod * 2].st = Arb[nod * 2 + 1].st = Arb[nod * 2 + 1].nr; 
				Arb[nod * 2].dr = Arb[nod * 2 + 1].dr = Arb[nod * 2 + 1].nr; 
				Arb[nod * 2].Mx = Arb[nod * 2 + 1].Mx = Arb[nod * 2 + 1].nr; 
			}
		}
		
		update(nod * 2, st, (st + dr) / 2, val);
		update(nod * 2 + 1, (st + dr) / 2 + 1, dr, val);
		
		get_arb_nod(nod, st, dr);
	}
}

int main() {

	freopen("hotel.in", "r", stdin);
	freopen("hotel.out", "w", stdout);
	
	scanf("%d %d", &n, &t);
	
	p2 = 1;
	while (p2 < n) p2 *= 2;
	arb_init(1, 1, p2);
	
	while (t--) {
		scanf("%d", &tip);

		if (tip < 3) {
			scanf("%d %d", &i, &m);
			p = i; q = i + m - 1;
			
			if (tip == 1) update(1, 1, p2, 1);
			else update(1, 1, p2, 0);
		}
		if (tip == 3) printf("%d\n", Arb[1].Mx);
	}
	
	return 0;
}