Cod sursa(job #551338)

Utilizator cosmyoPaunel Cosmin cosmyo Data 10 martie 2011 17:27:11
Problema Hotel Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.13 kb
#include <cstdio>
using namespace std;
const int N = 100005;
struct tip {int st, dr, s, subs; } v[4 * N];

int n, m, val, p1, p2;

void build(int st, int dr, int poz) {
	if(st == dr) {
		v[poz].st = v[poz].dr = v[poz].subs =  1;
		return ;
	}

	int x = (st + dr) >> 1;

	build(st, x, poz * 2);
	build(x + 1, dr, poz * 2 + 1);

	v[poz].st = v[poz].dr = v[poz].subs = dr - st + 1;  ;
}

inline int max(int a, int b) {
	return a > b ? a : b;
}

void update(int st, int dr, int poz) {

	if(p1 > dr || p2 < st)
		return ;

	if(p1 <= st && dr <= p2) {
//		fprintf(stderr, "%d %d\n", st, dr);
		v[poz].st +=  val * (dr - st + 1);
		v[poz].dr += val * (dr - st + 1);
		v[poz].subs += val * (dr - st + 1);
		v[poz].s = val;
		return ;
	}

	int x = (st + dr) / 2;
	
	if(v[poz].s) {
		v[poz * 2].st += v[poz].s * (x - st + 1);
		v[poz * 2].dr += v[poz].s * (x - st + 1);
		v[poz * 2].subs += v[poz].s * (x - st + 1);
		v[poz * 2].s = v[poz * 2 + 1].s = v[poz].s;

		v[poz * 2 + 1].st += v[poz].s * (dr - x);
		v[poz * 2 + 1].dr += v[poz].s * (dr - x);
		v[poz * 2 + 1].subs += v[poz].s * (dr - x);
		v[poz].s = 0;
	}
	update(st, x, poz * 2);
	update(x + 1, dr, poz * 2 + 1);

	v[poz].subs = max(v[poz * 2].subs, v[poz * 2 + 1].subs);
	v[poz].subs = max(v[poz].subs, v[poz * 2].dr + v[poz * 2 + 1].st);
	
	v[poz].st = v[poz * 2].st; 
	if(v[poz * 2].st == x - st + 1)
		v[poz].st += v[poz * 2 + 1].st;

	v[poz].dr = v[poz * 2 + 1].dr;
		if(v[poz * 2 + 1].dr == dr - x)
		v[poz].dr += v[poz * 2].dr;
}

int main() {
	freopen("hotel.in", "r", stdin);
	freopen("hotel.out", "w", stdout);
	int i, op;

	scanf("%d %d", &n, &m);

	build(1, n, 1);
//	return 0;
	for(;m; --m) {
		scanf("%d", &op);
		if(op == 1) {
			scanf("%d %d", &p1, &p2);
			p2 = p1 + p2 - 1;
			val = -1;
			update(1, n, 1);
	 //		printf("%d %d\n", p1, p2);
		}

		if(op == 2) {
			scanf("%d %d", &p1, &p2);
			p2 = p1 + p2 - 1;
			val = 1;
			update(1, n, 1);
	//		printf("%d %d\n", p1, p2);
		}

		if(op == 3) 
			printf("%d\n", v[1].subs);
		/*
		if(op <= 2)
			fprintf(stderr, "\n");
		for(i = 1; i <= 30; ++i) 
			fprintf(stderr, "%d %d %d %d\n",i,  v[i].st, v[i].dr, v[i].subs);
		fprintf(stderr, "\n"); */
	}

	return 0;
}