Cod sursa(job #386861)

Utilizator Cristi09Cristi Cristi09 Data 26 ianuarie 2010 11:08:44
Problema Hotel Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.99 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];
long MAX(long a,long b,long c,long d,long e)
{
	if(a>=b&&a>=c&&a>=d&&a>=e)return a;
	if(b>=a&&b>=c&&b>=d&&b>=e)return b;
	if(c>=a&&c>=b&&c>=d&&c>=e)return c;
	if(d>=a&&d>=b&&d>=c&&d>=e)return d;
	return e;
}
void init(long nod,long left,long right)
{
	if(left==right)
	{
		arb[nod].init(1);//arb[nod].lmax1;
		arb[nod].st=arb[nod].dr=left;
		return;
	}
	long mid=(left+right)/2;
	init(nod*2,left,mid);
	init(nod*2+1,mid+1,right);
	arb[nod].lmax=arb[nod].lleft=arb[nod].lright=arb[nod*2].lmax+arb[nod*2+1].lmax;
	arb[nod].st=left;
	arb[nod].dr=right;
}	
void update(long nod,long left,long right)
{
	if( start<=left && right<=finish &&(val==0&&left==right||val==1))
	{
		arb[nod].init(val*(right-left+1));
		return;
	}
	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(arb[nod*2].lmax,arb[nod*2+1].lmax,arb[nod*2].lright+arb[nod*2+1].lleft,arb[nod*2].lleft,arb[nod*2+1].lright);
	
	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;
}