Cod sursa(job #957448)

Utilizator veleanduAlex Velea veleandu Data 5 iunie 2013 00:17:05
Problema Hotel Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <iostream>
#include <fstream>
using namespace std;

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

const int max_n = 133000;

struct aib_node {
	int mid, right, left;
	aib_node () {
		mid = right = left = 0;
	}
	aib_node (int x) {
		set (x);
	}
	void set (int x) {
		mid = right = left = x;
	}
} aib[2*max_n];

void get_max (int &a, int b) {
	if (a < b)
		a = b;
}

void split (int nod, int st, int dr) {
	int s = dr - st + 1;
 	if (st == dr)
		return ;
	if (aib[nod].mid == s || aib[nod].mid == 0)
		;
	else
		return;
	int multi = (s>0);
	int mid = (dr + st) / 2;
	aib[2 * nod].set ((mid - st + 1) * multi);
	aib[2 * nod + 1].set ((dr - (mid + 1) + 1) * multi);
	return ;
}


void update (int nod, int st, int dr, int a, int b, int multi) {
	if (a <= st && dr <= b) {
		aib[nod].set(multi * (dr - st + 1));
		return ;
	}
	split (nod, st, dr);
	int mid = (st + dr) / 2;
 	if (a <= mid)
		update (2 * nod, st, mid, a, b, multi);
	if (mid < b)
		update (2 * nod + 1, mid + 1, dr, a, b, multi);
 	aib_node l = aib[2 * nod], r = aib[2 * nod + 1];
	aib[nod].mid = max (l.mid, r.mid);
	aib[nod].left = l.left;
	aib[nod].right = r.right;
	if (r.mid == dr - (mid + 1) + 1)
		aib[nod].right = l.right + dr - mid;
	if (l.mid == mid - st + 1)
		aib[nod].left = r.left + mid - st + 1;
	get_max (aib[nod].mid, aib[nod].left);
	get_max (aib[nod].mid, aib[nod].right);
	get_max (aib[nod].mid, l.right + r.left);
}

void init (int nod, int st, int dr) {
	aib[nod].set (dr-st+1);
	if (st == dr)
		return ;
	int mid = (dr+st)/2;
	init (2*nod, st, mid);
	init (2*nod+1, mid+1, dr);
}

int main() {
	int n, q;
	in >> n >> q;
	init (1, 1, n);
	while (q--) {
		int t;
		in >> t;
		if (t == 3) {
			out << aib[1].mid << "\n";
			continue;
		}
		int a, b, multi = 1;
		in >> a >> b;
		b += a-1;
		if (t == 1)
			multi = 0;
		update (1, 1, n, a, b, multi);
	}
	return 0;
}