Cod sursa(job #1450515)

Utilizator vladrochianVlad Rochian vladrochian Data 13 iunie 2015 15:51:37
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <fstream>
using namespace std;

const int kMaxSize = 262150;

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

struct {
	int left, right, best;
} a[kMaxSize];
int N, P;

void Update(int node, int l, int r, int rl, int rr, int type) {
	if (rr < l || r < rl)
		return;

	if (rl <= l && r <= rr) {
		if (type == 1)
			a[node].left = a[node].right = a[node].best = 0;
		else
			a[node].left = a[node].right = a[node].best = r - l + 1;
		return;
	}

	int ls = node << 1, rs = ls + 1;
	int m = (l + r) / 2;

	if (a[node].best == 0) {
		a[ls].left = a[ls].right = a[ls].best = 0;
		a[rs].left = a[rs].right = a[rs].best = 0;
	} else if (a[node].best == r - l + 1) {
		a[ls].left = a[ls].right = a[ls].best = m - l + 1;
		a[rs].left = a[rs].right = a[rs].best = r - m;
	}

	Update(ls, l, m, rl, rr, type);
	Update(rs, m + 1, r, rl, rr, type);

	a[node].left = a[ls].left;
	if (a[ls].left == m - l + 1)
		a[node].left += a[rs].left;

	a[node].right = a[rs].right;
	if (a[rs].right == r - m)
		a[node].right += a[ls].right;

	a[node].best = max(max(a[ls].best, a[rs].best), a[ls].right + a[rs].left);
}

int main() {
	fin >> N >> P;
	Update(1, 1, N, 1, N, 2);
	while (P--) {
		int t, l, r, s;
		fin >> t;
		if (t == 3) {
			fout << a[1].best << "\n";
		} else {
			fin >> l >> s;
			r = l + s - 1;
			Update(1, 1, N, l, r, t);
		}
	}
	return 0;
}