Cod sursa(job #541950)

Utilizator Addy.Adrian Draghici Addy. Data 25 februarie 2011 16:51:18
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <cstdio>
#include <algorithm>

using namespace std;

#define NMAX 100050

#define ns (nod << 1)
#define nd ((nod << 1) + 1)
#define mij ((st + dr) >> 1)

struct arb {
	int a, b, c;
} A[4 * NMAX];

int tip, n, m, i, a, b;

void arbore (int, int, int), update (int, int, int, int, int, int);

int main () {
	
	freopen ("hotel.in", "r", stdin);
	freopen ("hotel.out", "w", stdout);
	
	scanf ("%d %d", &n, &m);
	
	arbore (1, 1, n);
	
	for (i = 1; i <= m; i++) {
		scanf ("%d", &tip);
		
		if (tip == 1) {
			scanf ("%d %d", &a, &b);
			update (1, 1, n, a, a + b - 1, 1);
		}
		
		if (tip == 2) {
			scanf ("%d %d", &a, &b);
			update (1, 1, n, a, a + b - 1, 0);
		}
		
		if (tip == 3) printf ("%d\n", A[1].c);
	}
	
	return 0;
}

void arbore (int nod, int st, int dr) {
	
	if (st == dr) {
		A[nod].a = A[nod].b = A[nod].c = 1;
		return;
	}
	
	arbore (ns, st, mij);
	arbore (nd, mij + 1, dr);
	
	A[nod].a = A[nod].b = A[nod].c = dr - st + 1;
}

void update (int nod, int st, int dr, int a, int b, int nr) {
	
	if (a <= st && dr <= b) {
		if (!nr) A[nod].a = A[nod].b = A[nod].c = dr - st + 1;
		else A[nod].a = A[nod].b = A[nod].c = 0;
		return;
	}
	
	if (A[nod].c == 0) {
		A[ns].a = A[ns].b = A[ns].c = 0;
		A[nd].a = A[nd].b = A[nd].c = 0;
	}
	
	if (A[nod].c == dr - st + 1) {
		A[ns].a = A[ns].b = A[ns].c = mij - st + 1;
		A[nd].a = A[nd].b = A[nd].c = dr - mij;
	}
	
	if (a <= mij) update (ns, st, mij, a, b, nr);
	if (mij < b) update (nd, mij + 1, dr, a, b, nr);
	
	A[nod].a = A[ns].a;
	if (A[ns].a == mij - st + 1) A[nod].a += A[nd].a;
	
	A[nod].b = A[nd].b;
	if (A[nd].b == dr - mij) A[nod].b += A[ns].b;
	
	A[nod].c = max (A[nod].a, A[nod].b);
	A[nod].c = max (A[nod].c, max (A[ns].c, max (A[nd].c, A[ns].b + A[nd].a)));
}