Cod sursa(job #653118)

Utilizator arch_enemyAngela Gossow arch_enemy Data 27 decembrie 2011 14:00:20
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <cstdio>
#include <algorithm>

using namespace std;

#define LMAX 262144

int N, Q, Op, A, B, ASt[LMAX], ADr[LMAX], ABest[LMAX];

inline void Build( int Nod, int St, int Dr )
{
	ASt[Nod] = ADr[Nod] = ABest[Nod] = Dr - St + 1;
	if( St == Dr ) return;
	
	int M = St + ((Dr - St)>>1);
	
	Build( (Nod<<1), St, M );
	Build( ((Nod<<1)|1), M + 1, Dr );
}

inline void Update( int Nod, int St, int Dr, int AQ, int BQ, int Val )
{
	if( AQ <= St && Dr <= BQ )
	{
		ASt[Nod] = ADr[Nod] = ABest[Nod] = (Dr - St + 1)*Val;
		return;
	}
	
	int M = St + ((Dr - St)>>1);
	
	if( ABest[Nod] == Dr - St + 1 )
	{
		ABest[(Nod<<1)] = ASt[(Nod<<1)] = ADr[(Nod<<1)] = M - St + 1;
		ABest[((Nod<<1)|1)] = ASt[((Nod<<1)|1)] = ADr[((Nod<<1)|1)] = Dr - M;
	}
	else if( !ABest[Nod] )
		ABest[(Nod<<1)] = ASt[(Nod<<1)] = ADr[(Nod<<1)] = ABest[((Nod<<1)|1)] = ASt[((Nod<<1)|1)] = ADr[((Nod<<1)|1)] = 0;
	
	if( AQ <= M ) Update( (Nod<<1), St, M, AQ, BQ, Val );
	if( BQ > M ) Update( ((Nod<<1)|1), M + 1, Dr, AQ, BQ, Val );
	
	ASt[Nod] = ASt[(Nod<<1)];
	if( ASt[Nod] == M - St + 1 ) ASt[Nod] += ASt[((Nod<<1)|1)];
	
	ADr[Nod] = ADr[((Nod<<1)|1)];
	if( ADr[Nod] == Dr - M ) ADr[Nod] += ADr[(Nod<<1)];
	
	ABest[Nod] = max( max( ABest[(Nod<<1)], ABest[((Nod<<1)|1)] ), ADr[(Nod<<1)] + ASt[((Nod<<1)|1)] );
}

int main()
{
	freopen("hotel.in", "r", stdin);
	freopen("hotel.out", "w", stdout);
	
	scanf("%d%d", &N, &Q );
	
	Build( 1, 1, N );
	
	for( ; Q--; )
	{
		scanf("%d", &Op );
		if( Op == 3 ) printf("%d\n", ABest[1] );
		else
		{
			scanf("%d%d", &A, &B );
			Update( 1, 1, N, A, A + B - 1, 1 - Op%2 );
		}
	}
	
	return 0;
}