Cod sursa(job #387139)

Utilizator Cristi09Cristi Cristi09 Data 26 ianuarie 2010 21:39:12
Problema Hotel Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.92 kb
#include<stdio.h>
long n,p,m,pos,val,start,finish;
int c;
struct la
{
	void init(long a)
	{
		lmax=lleft=lright=a;
	}
	long lmax,lleft,lright,st,dr;
}arb[400100];
inline long MAX(long a,long b)
{
    if(a>=b)return a;
    return b;
}
void init(long nod,long left,long right)
{
    arb[nod].init(right-left+1);
    if(left==right)
    return ;
    init(nod*2,left,(left+right)/2);
    init(nod*2+1,(left+right)/2+1,right);
}	
void update(long nod,long left,long right)
{
	if( start<=left && right<=finish )
	{
		arb[nod].init(val*(right-left+1));
		return;
	}
	if(arb[nod].lmax==0)
	{
		arb[nod*2].init(0);
		arb[nod*2+1].init(0);
	}
    else
    if(arb[nod].lmax=arb[nod].dr-arb[nod].st+1)
    {
         arb[nod*2].init((arb[nod].dr+arb[nod].st)/2-arb[nod].st+1);
         arb[nod*2+1].init(arb[nod].dr-(arb[nod].st+arb[nod].dr)/2);
    }
	long div=(left+right)/2;
	if(start<=div)update(nod*2,left,div);
	if(div<finish)update(nod*2+1,div+1,right);
	
	arb[nod].lmax=MAX(MAX(arb[nod*2].lmax,arb[nod*2+1].lmax),arb[nod*2].lright+arb[nod*2+1].lleft);
	
	arb[nod].lleft=arb[nod*2].lleft;
	arb[nod].lright=arb[nod*2+1].lright;
	
	int ok=0;
	
	if(arb[nod].lmax==arb[nod].dr-arb[nod].st+1)
	{arb[nod].lleft=arb[nod].lright=arb[nod].lmax;ok=1;}
		
	if(!ok&&arb[nod*2+1].lmax==arb[nod*2+1].lright&&arb[nod*2+1].lmax==arb[nod*2+1].dr-arb[nod*2+1].st+1)
	arb[nod].lright+=arb[nod*2].lright;
	
	if(!ok&&arb[nod*2].lmax==arb[nod*2].lright&&arb[nod*2].lmax==arb[nod*2].dr-arb[nod*2].st+1)
	arb[nod].lleft+=arb[nod*2+1].lleft;
}
int main()
{
	FILE*f=fopen("hotel.in","r");
	fscanf(f,"%ld %ld",&n,&p);
	init(1,1,n);
	FILE*g=fopen("hotel.out","w");
	
	for(;p;--p)
	{
		fscanf(f,"%d",&c);
		if(c!=3)
		{
			fscanf(f,"%ld %ld",&pos,&m);
			val=(c-1);
			start=pos;
			finish=pos+m-1;
			update(1,1,n);
		}
		else
		{
			fprintf(g,"%ld\n",arb[1].lmax);
		}
	}
	fclose(f);
	fclose(g);
	return 0;
}