Cod sursa(job #530757)

Utilizator jeanFMI - Petcu Ion Cristian jean Data 8 februarie 2011 13:38:55
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
#include<stdio.h>
#define Nmax 100010

struct nnod { int s,d,x; } A[Nmax<<2];

int op , a , b , i , n , m ;

void init ( int nod , int s, int d )
{
	if( s == d ) 
	{
		A[nod].s = s ;
		A[nod].d = d;
		A[nod].x = 1 ; 
		return ;
	}
	
	int m = ( s + d ) >> 1; 
	int st = nod<<1;
	int dr = 1 + (nod<<1);
	
	init( st , s , m ) ;
	init( dr , m+1 , d );
	
	A[nod].s = d ;  A[nod].d = s ;
	A[nod].x = d - s + 1 ;
}

void update ( int nod, int s, int d, int op ) 
{
	if ( a <= s && d <= b )
	{
		if(op == 1) 
		{
			A[nod].x = 0 ; 	A[nod].s = s-1; A[nod].d = d+1;
		}
		else
		{
			A[nod].x = d-s+1; A[nod].s = d ; A[nod].d = s ;
		}
		return ;
	}
	
	int m = ( s + d ) >> 1 ;
	int st = nod<<1;
	int dr = 1 + (nod<<1);
	
	if( A[nod].x == d-s+1 ) 
	{
		A[st].x = m-s+1; A[st].s = m ; 	A[st].d = s ; 
		A[dr].x = d-m ; A[dr].s = d ; 	A[dr].d = m+1 ; 
	}
	else if( A[nod].x == 0 ) 
	{
		A[st].x = 0 ; A[st].s = s-1 ; A[st].d = m+1 ; 
		A[dr].x = 0 ; A[dr].s = m ;	A[dr].d = d+1 ; 
	}
	
	if( a <= m ) update(st,s,m,op);
	if( m < b )	 update(dr,m+1,d,op);
	
	
	if( ( A[st].x == m-s+1 ) &&  ( A[dr].x == d-m ) )
	{
		A[nod].s = d ; A[nod].d = s ;
	}
	else if( A[st].x == m-s+1 )
	{
		A[nod].s = A[dr].s ; A[nod].d = A[dr].d ;
	}
	else if( A[dr].x == d-m )
	{
		A[nod].s = A[st].s ; A[nod].d = A[st].d ;
	}
	else
	{
		A[nod].s = A[st].s ;  A[nod].d = A[dr].d ;
	}
	
	A[nod].x = A[dr].s - A[st].d + 1 ;
	if( A[st]. x > A[nod].x ) A[nod].x = A[st].x;
	if( A[dr]. x > A[nod].x ) A[nod].x = A[dr].x;
}
	
int main()
{
	freopen("hotel.in","r",stdin);
	freopen("hotel.out","w",stdout);
	
	scanf("%d %d",&n,&m);
	
	init(1,1,n) ; 
	
	for( i = 1 ; i <= m ; i++ )
	{
		scanf("%d",&op);
		
		if( op < 3 ) 
		{
			scanf("%d %d",&a,&b);
			b = a + b - 1 ;
			update(1,1,n,op);
		}
		else 
			printf("%d\n",A[1].x);
	}
	
	return 0;
}