Cod sursa(job #1365051)

Utilizator cernat.catallinFMI Cernat Catalin Stefan cernat.catallin Data 27 februarie 2015 23:58:21
Problema Hotel Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.68 kb
#include <fstream>
#include <algorithm>
using namespace std;

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

const int Nmax = 100005;
const int tree_size = 1 << 18;

struct node {
	int max_total;
	int max_st, max_dr;
};

int n, p;

node tree[tree_size];
int lazy[tree_size];
int a, b, result, value;

void update_node(int node, int l, int r) {
	if (lazy[node]) {
		if (lazy[node] == 1)
			tree[node].max_st = tree[node].max_dr =
			tree[node].max_total = 0;
		else
			tree[node].max_st = tree[node].max_dr =
			tree[node].max_total = (r - l + 1);
		if (r != l) {
			lazy[node << 1] = lazy[node];
			lazy[(node << 1) + 1] = lazy[node];
		}
		lazy[node] = 0;
	}
}

void combine_node(int node, int l, int r){
	int left = node << 1;
	int right = (node << 1) + 1;
	int m = (l + r) >> 1;

	tree[node].max_st = tree[left].max_st;
	tree[node].max_dr = tree[right].max_dr;

	if (tree[left].max_st == (m - l + 1))
		tree[node].max_st += tree[right].max_st;
	if (tree[right].max_dr == (r - m))
		tree[node].max_dr += tree[left].max_dr;

	tree[node].max_total = tree[left].max_dr + tree[right].max_st;
	tree[node].max_total = max(tree[node].max_total, tree[node].max_st);
	tree[node].max_total = max(tree[node].max_total, tree[node].max_dr);
	tree[node].max_total = max(tree[node].max_total, tree[left].max_total);
	tree[node].max_total = max(tree[node].max_total, tree[right].max_total);
}

void update_tree(int node, int l, int r) {
	// lazy[node] == 1, make interval full
	// lazy[node] == -1, make interval vacant
	update_node(node, l, r);
	if (b < l || r < a)
		return;
	if (a <= l && r <= b) {
		if (value == 1)
			tree[node].max_st = tree[node].max_dr =
			tree[node].max_total = 0;
		else
			tree[node].max_st = tree[node].max_dr =
			tree[node].max_total = (r - l + 1);

		if (r != l) {
			lazy[node << 1] += value;
			lazy[(node << 1) + 1] += value;
		}
	}
	else {
		int m = (l + r) >> 1;
		update_tree(node << 1, l, m);
		update_tree((node << 1) + 1, m + 1, r);
		combine_node(node, l, r);
	}
}

void construct_tree(int node, int l, int r) {
	if (l == r)
		tree[node].max_st = tree[node].max_dr = tree[node].max_total = 1;
	else {
		int m = (l + r) >> 1;
		construct_tree(node << 1, l, m);
		construct_tree((node << 1) + 1, m + 1, r);
		combine_node(node, l, r);
	}
}

int main() {
	int c, x;

	in >> n >> p;
	construct_tree(1, 1, n);
	for (int i = 1; i <= p; ++i) {
		in >> c;
		if (c == 1) {
			in >> a >> x;
			b = a + x - 1;
			value = 1;
			update_tree(1, 1, n);
		}
		else if (c == 2) {
			in >> a >> x;
			b = a + x - 1;
			value = -2;
			update_tree(1, 1, n);
		}
		else {
			out << tree[1].max_total << '\n';
		}
	}
}