Cod sursa(job #1939999)

Utilizator preda.andreiPreda Andrei preda.andrei Data 26 martie 2017 12:01:10
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.15 kb
#include <fstream>
#include <vector>

using namespace std;

struct Node
{
	int left, right, best;
};

inline unsigned LeftSon(int a) { return (a << 1); }
inline unsigned RightSon(int a) { return (a << 1) + 1; }

void UpdateLazy(vector<Node> &aint, vector<int> &lazy, int node, int l, int r)
{
	if (lazy[node] != 0) {
		if (LeftSon(node) < lazy.size()) {
			lazy[LeftSon(node)] = lazy[node];
		}
		if (RightSon(node) < lazy.size()) {
			lazy[RightSon(node)] = lazy[node];
		}

		if (lazy[node] == 1) {
			aint[node].left = aint[node].right = aint[node].best = 0;
		} else {
			aint[node].left = aint[node].right = aint[node].best = r - l + 1;
		}
		lazy[node] = 0;
	}
}

void Update(vector<Node> &aint, vector<int> &lazy, int node, int l, int r, int a, int b, int val)
{
	UpdateLazy(aint, lazy, node, l, r);
	if (a <= l && r <= b) {
		lazy[node] = val;
		UpdateLazy(aint, lazy, node, l, r);
		return;
	}

	int mid = l + (r - l) / 2;
	if (a <= mid) {
		Update(aint, lazy, LeftSon(node), l, mid, a, b, val);
		UpdateLazy(aint, lazy, RightSon(node), mid + 1, r);
	}
	if (b > mid) {
		Update(aint, lazy, RightSon(node), mid + 1, r, a, b, val);
		UpdateLazy(aint, lazy, LeftSon(node), l, mid);
	}

	aint[node].left = aint[LeftSon(node)].left;
	if (aint[node].left == mid - l + 1) {
		aint[node].left += aint[RightSon(node)].left;
	}

	aint[node].right = aint[RightSon(node)].right;
	if (aint[node].right == r - mid) {
		aint[node].right += aint[LeftSon(node)].right;
	}

	aint[node].best = max(aint[node].left, aint[node].right);
	aint[node].best = max(aint[node].best, aint[LeftSon(node)].right + aint[RightSon(node)].left);
	aint[node].best = max(aint[node].best, max(aint[LeftSon(node)].best, aint[RightSon(node)].best));	
}

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

	int n, m;
	fin >> n >> m;

	vector<Node> aint(4 * n + 4);
	vector<int> lazy(4 * n + 4, 0);

	for (int i = 1; i <= n; ++i) {
		Update(aint, lazy, 1, 1, n, i, i, -1);
	}

	while (m--) {
		int t;
		fin >> t;

		if (t == 3) {
			fout << aint[1].best << "\n";
		} else {
			int start, len;
			fin >> start >> len;
			Update(aint, lazy, 1, 1, n, start, start + len - 1, (t == 1) ? 1 : -1);
		}
	}

	return 0;
}