Cod sursa(job #1149349)

Utilizator antonioteoZait Teodor Antonio antonioteo Data 21 martie 2014 18:41:53
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <fstream>
using namespace std;

ifstream fin("hotel.in");
ofstream fout("hotel.out");

#define NMAX 100001
#define L (n << 1)
#define R (L | 1)

int i, op, M, N, P;

int Ans[NMAX * 3];
int Left[NMAX * 3];
int Right[NMAX * 3];

inline void update(int n, int l, int r, int i, int j, int v) {
	if (i <= l && r <= j) {
		Ans[n] = Left[n] = Right[n] = (r - l + 1) * v;
		return;
	}
	int m = (l + r) >> 1;
	if (v == 1) {
		if (Ans[n] == 0) {
			Left[L] = Left[R] = Right[L] = Right[R] = Ans[L] = Ans[R] = 0;
			Ans[n] = r - l + 1;
		}
	}
	else {
		if (Ans[n] == r - l + 1) {
			Ans[L] = Left[L] = Right[L] = m - l + 1;
			Ans[R] = Left[R] = Right[R] = r - (m + 1) + 1;
			Ans[n] = Left[n] = Right[n] = 0;
		}
	}
	if (i <= m) update(L, l, m, i, j, v);
	if (j > m) update(R, m + 1, r, i, j, v);
	Left[n] = Left[L];
	if (Ans[L] == m - l + 1) Left[n] = Ans[L] + Left[R];
	Right[n] = Right[R];
	if (Ans[R] == r - (m + 1) + 1) Right[n] = Ans[R] + Right[L];
	Ans[n] = max(Right[L] + Left[R], max(Ans[L], Ans[R]));
	Ans[n] = max(Ans[n], max(Left[n], Right[n]));
}

int main() {
	fin >> N >> P;
	update(1, 1, N, 1, N, 1);
	while (P--) {
		fin >> op;
		if (op == 3) {
			fout << Ans[1] << '\n';
			continue;
		}
		fin >> i >> M;
		if (op == 2) {
			update(1, 1, N, i, i + M - 1, 1);
			continue;
		}
		update(1, 1, N, i, i + M - 1, 0);
	}
	return 0;
}