Cod sursa(job #293321)

Utilizator katakunaCazacu Alexandru katakuna Data 1 aprilie 2009 16:08:19
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.02 kb
using namespace std;
#include <cstdio>
#include <algorithm>

#define Nmax 100010

int n1, n2, x, y, n, m, i, tip, q, a[3][4 * Nmax];

void update(int nod, int st, int dr, int p, int u, int val){

	int mij = (st + dr) >> 1;
	if( p <= st && dr <= u ){
		
		if( val == 1 )
			a[0][nod] = a[1][nod] = a[2][nod] = dr - st + 1;
		
		else
			a[0][nod] = a[1][nod] = a[2][nod] = 0;
		
		return ;
	}
	
	if( a[1][nod] == 0 ){
		n1 = nod << 1;
		a[0][n1] =  a[1][n1] =  a[2][n1] = 0;
		
		n1 = (nod << 1) + 1;
		a[0][n1] = a[1][n1] = a[2][n1] = 0;
	}
	
	if( a[1][nod] == dr - st + 1 ){
		q = mij - st + 1;
		n1 = nod << 1;
		a[0][n1] = a[1][n1] = a[2][n1] = q;
		
		q = dr - (mij + 1) + 1;
		n1 = (nod << 1) + 1;
		a[0][n1] = a[1][n1] = a[2][n1] = q;
	}
	
	if( p <= mij ) update( (nod<<1), st, mij, p, u, val);
	if( u > mij ) update( (nod<<1) + 1, mij + 1, dr, p, u, val );
	
	n1 = nod << 1; n2 = (nod << 1) + 1;
	a[0][nod] = a[0][n1];
	if( a[0][n1] == mij - st + 1 ) a[0][nod]+=a[0][n2];

	a[2][nod] = a[2][n2];
	if( a[2][n2] == dr - (mij+1) + 1 ) a[2][nod]+=a[2][n1];
	
	a[1][nod] = max(a[0][nod], a[2][nod]);
	a[1][nod] = max(a[1][nod], a[1][n1]);
	a[1][nod] = max(a[1][nod], a[1][n2]);
	a[1][nod] = max(a[1][nod], a[2][n1]+a[0][n2]);
	
}

void update2(int nod, int st, int dr){
	
	int mij = (st + dr) >> 1;
	if(st == dr){
		a[0][nod] = a[1][nod] = a[2][nod] = 1;
		return ;
	}
	
	a[0][nod] = dr - st + 1; a[1][nod] = dr - st + 1; a[2][nod] = dr - st + 1;
	update2(nod<<1, st, mij);
	update2((nod<<1)+1, mij+1, dr);
	
}

int main(){

	FILE *f = fopen("hotel.in", "r");
	FILE *g = fopen("hotel.out", "w");

	fscanf(f,"%d %d",&n, &m);	
	update2(1, 1, n);
	
	for(i = 1; i <= m; i++){
		fscanf(f,"%d",&tip);
		if( tip == 1 ){
			fscanf(f,"%d %d",&x, &y);
			update(1, 1, n, x, x + y - 1, 0);
		}
		
		if(tip == 2){
			fscanf(f,"%d %d",&x, &y);
			update(1, 1, n, x, 	y = x + y - 1, 1);
		}
		
		if(tip == 3)
			fprintf(g,"%d\n",a[1][1]);
	}
	
	fclose(f);
	fclose(g);
	
	return 0;
}