Cod sursa(job #536878)

Utilizator PlayLikeNeverB4George Marcus PlayLikeNeverB4 Data 19 februarie 2011 16:52:32
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <fstream>
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");

#define maxn 400005

int i,N,M,P,a,b,c,val;
int A[maxn],L[maxn],R[maxn];

inline int max(int a, int b)
{
	return a>b ? a : b;
}

void init(int k, int st, int dr)
{
	A[k]=L[k]=R[k]=dr-st+1;
	if(st==dr) return;
	int m=st+(dr-st)/2;
	init(2*k,st,m);
	init(2*k+1,m+1,dr);
}

void update(int k, int st, int dr)
{
	if(a<=st && dr<=b)
	{
		A[k]=L[k]=R[k]=val*(dr-st+1);
		return;
	}
	int m=st+(dr-st)/2;
	
	if(A[k]==0) { A[2*k]=L[2*k]=R[2*k]=0; A[2*k+1]=L[2*k+1]=R[2*k+1]=0; }
	if(A[k]==dr-st+1)
	{	A[2*k]=L[2*k]=R[2*k]=m-st+1; A[2*k+1]=L[2*k+1]=R[2*k+1]=dr-m; }
	
	if(a<=m) update(2*k,st,m);
	if(m<b) update(2*k+1,m+1,dr);
	
	L[k]=L[2*k];
	if(L[2*k]==m-st+1) L[k]+=L[2*k+1];
	R[k]=R[2*k+1];
	if(R[2*k+1]==dr-m) R[k]+=R[2*k];
	A[k]=max( max(A[2*k],A[2*k+1]), R[2*k]+L[2*k+1] );
}

int main()
{
	fin >> N >> P;
	init(1,1,N);
	for(;P;P--)
	{
		fin >> c;
		if(c==3) { fout << A[1] << '\n'; continue; }
		fin >> i >> M;
		a=i; b=i+M-1; val= c-1;
		update(1,1,N);
	}
}