Cod sursa(job #382438)

Utilizator ciprianfFarcasanu Alexandru Ciprian ciprianf Data 13 ianuarie 2010 18:11:11
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 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;
//int A, B, C, D;
int n, m;
inline int max(int a, int b){
	if(a > b) return a;
	return b;
}
void initializare(int p, int q,int i){
	
	st[i] = dr[i] = in[i] = q-p+1;
	if(p==q) return;
	initializare(p, (p+q)/2, 2*i);
	initializare((p+q)/2+1,q,2*i+1);
}
void update(int p, int q, int a, int b, int i,int ok1,int ok2){
	if(a <= p && q <= b){
		if(ok1){
			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;
		}
		return ;
	}
	int m = (p+q)>>1;
	okz[i] = 0;
	if(in[i] == 0)
		st[i*2] = dr[i*2] = in[i*2] = st[i*2+1] = dr[i*2+1] = in[i*2+1] = 0;
	else if(in[i] == q-p+1){
		st[i*2] = dr[i*2] = in[i*2] = (p+q)/2-p + 1;
		st[i*2+1] = dr[i*2+1] = in[i*2+1] = q - (p+q)/2;
}
	if(a <= m)
		update(p, m, a , b, 2*i, ok1, ok2); 
	if(b > m) update(m+1, q, a, b, 2*i+1, ok1, ok2);
	
	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];
	in[i] = max(in[i], max(st[i],dr[i]));
}
int main(){
	int i;
	freopen("hotel.in", "r", stdin);
	freopen("hotel.out", "w", stdout);
	scanf("%d%d", &n, &m);
	initializare(1,n,1);
	for(i = 1; i <= m; ++i){
		int x, y;
		scanf("%d", &x);
		if(x == 1){
			scanf("%d%d", &x, &y);
			update(1,n, x, x+y-1, 1, 1, 0);
		}
		else if(x== 2){
			scanf("%d%d", &x, &y);
			update(1,n, x, x+y-1, 1, 0, 0);
		}
		else printf("%d\n",in[1]);
	}
	return 0;
}