Cod sursa(job #382095)

Utilizator ciprianfFarcasanu Alexandru Ciprian ciprianf Data 12 ianuarie 2010 20:16:09
Problema Hotel Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <stdio.h>
#define NMAX 100005
int t[NMAX*3], st[NMAX*3], dr[NMAX*3], in[NMAX*3], okz[NMAX*3];
int n, m, a, b, ok, P, Q, ok2;
inline int max(int a, int b){
	if(a > b) return a;
	return b;
}
void rezolva(int x, int y){
	int fiu;
	if(2*x+1 == y) {
		fiu  = 2*x;
		okz[fiu] = 1;
		t[fiu] = (P+Q)/2 - P + 1;
		st[fiu] = dr[fiu] = in[fiu] = 0;
	}
	else {
		fiu = 2*x+1;
		okz[fiu] = 1;
		t[fiu] = Q - (P+Q)/2;
		st[fiu] = dr[fiu] = in[fiu] = 0;
	}
	
}
void update(int p, int q, int i){
	if(a <= p && q <= b){
		if(ok){
			t[i] = q - p + 1;
			st[i] = dr[i] = in[i] = 0;
			okz[i] = 1;
		}
		else {
			t[i] = 0;
			okz[i] = 0;
			st[i] = dr[i] = in[i] = q-p+1;
			if(ok2)
				rezolva(i/2, i);
		}
		return ;
	}
	P = p;
	Q = q;
	int m = (p+q)>>1;
	ok2 |= okz[i];
	okz[i] = 0;
	if(a <= m) update(p, m, 2*i);
	P = p;
	Q = q;
	if(b > m) update(m+1, q, 2*i+1);
	
	if(t[2*i] == 0) st[2*i] = dr[2*i] = in[2*i] = m-p+1;
	if(t[2*i+1] == 0) st[2*i+1] = dr[2*i+1] = in[2*i+1] = q-m;
	in[i] = max(dr[2*i]+st[2*i+1], max(in[2*i], in[2*i+1]));
	
	if(st[2*i] == m-p+1) st[i] = st[2*i] + st[2*i+1];
	else st[i] = st[2*i];
	if(dr[2*i+1] == q-m) dr[i] = dr[2*i+1] + dr[2*i];
	else dr[i] = dr[2*i+1];
	t[i] = t[2*i]+t[2*i+1];
}
int main(){
	int i;
	freopen("hotel.in", "r", stdin);
	freopen("hotel.out", "w", stdout);
	scanf("%d%d", &n, &m);
	for(i = 1; i <= m; ++i){
		int x, y;
		scanf("%d", &x);
		if(x == 1){
			scanf("%d%d", &x, &y);
			a = x; b = x + y - 1;
			ok = 1;
			update(1,n,1);
		}
		else if(x== 2){
			scanf("%d%d", &x, &y);
			a = x; b = x + y - 1;
			ok = 0;
			ok2 = 0;
			update(1,n,1);
		}
		else if(i == 1) printf("%d\n", n);
		else printf("%d\n",in[1]);
	}
	return 0;
}