Cod sursa(job #324196)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 14 iunie 2009 20:49:41
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.98 kb
#include <stdio.h>

#define file_in "hotel.in"
#define file_out "hotel.out"

#define Nmax 500010

struct arbint
{
	int st,dr,sum;
}ai[Nmax];

int n,m;
int x,y,tip;


void citire()
{
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	scanf("%d %d", &n,&m);
}

void build(int nod, int st, int dr)
{
	int mij=(st+dr)>>1;
	
		
	ai[nod].st=ai[nod].dr=ai[nod].sum=dr-st+1;
	
	if (st==dr)
		return  ;
	
	build(2*nod,st,mij);
	build(2*nod+1,mij+1,dr);
}

void update(int nod, int st, int dr)
{
	int mij=(st+dr)>>1;
	
	
	if (x<=st && dr<=y)
	{
		if (tip==1)
		{
			ai[nod].st=ai[nod].dr=ai[nod].sum=0;
		}
		else
		{
			ai[nod].st=ai[nod].dr=ai[nod].sum=dr-st+1;
		}
		
		return ;
	}
	
	if (tip==1 && ai[nod].sum==dr-st+1)
	{
		ai[2*nod].st=ai[2*nod].dr=ai[2*nod].sum=mij-st+1;
		ai[2*nod+1].st=ai[2*nod+1].dr=ai[2*nod+1].sum=dr-mij;
	}
	if (tip==2 && ai[nod].sum==0)
	{
		ai[2*nod].st=ai[2*nod].dr=ai[2*nod].sum=0;
		ai[2*nod+1].st=ai[2*nod+1].dr=ai[2*nod+1].sum=0;
	}
	
	if (x<=mij)
		update(2*nod,st,mij);
	if (mij<y)
		update(2*nod+1,mij+1,dr);
	
	if (ai[2*nod].sum==mij-st+1)
	{
		ai[nod].st=ai[2*nod].sum+ai[2*nod+1].st;
	}
	else
	{
		ai[nod].st=ai[2*nod].st;
	}
	
	if (ai[2*nod+1].sum==dr-mij)
	{
		ai[nod].dr=ai[2*nod+1].sum+ai[2*nod].dr;
	}
	else
	{
		ai[nod].dr=ai[2*nod+1].dr;
	}
	
	ai[nod].sum=ai[2*nod+1].st+ai[2*nod].dr;
	if (ai[nod].dr>ai[nod].sum)
		ai[nod].sum=ai[nod].dr;
	if (ai[nod].st>ai[nod].sum)
		ai[nod].sum=ai[nod].st;
	if (ai[2*nod].sum>ai[nod].sum)
		ai[nod].sum=ai[2*nod].sum;
	if (ai[2*nod+1].sum>ai[nod].sum)
		ai[nod].sum=ai[2*nod+1].sum;
}


int main()
{
	int i;
	citire();
	
	build(1,1,n);
	
	for (i=1;i<=m;++i)
	{
		scanf("%d", &tip);
		if (tip==1 || tip==2)
		{
			scanf("%d %d", &x,&y);
			y=y+x-1;
	        update(1,1,n);
		}
	    else
		printf("%d\n", ai[1].sum);
    }
	
	/*printf("%d", ai[1].sum);*/

	fclose(stdin);
	fclose(stdout);
	
	return 0;
}