Cod sursa(job #392071)

Utilizator Andreid91Ciocan Andrei Andreid91 Data 6 februarie 2010 18:16:28
Problema Hotel Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.25 kb
#include<fstream.h>

# define maxn 300300  

int l[maxn],r[maxn],max[maxn],sw[maxn];


void update1 (int st, int dr, int x, int y, int k)
{
	if (st>=x && dr<=y)
	{
		sw[k]=1;
		l[k]=r[k]=max[k]=0;
	}
	else
	{
		int mij=(st+dr)/2;
		if (sw[k]==1)
		{
			sw[k]=0;
			sw[2*k]=sw[2*k+1]=1;
			if (mij>=x)
				update1 (st,mij,x,y,2*k);
			else
				max[2*k]=l[2*k]=r[2*k]=mij-st+1;
			
			if (mij<y)
				update1 (mij+1,dr,x,y,2*k+1);
			else
				max[2*k+1]=l[2*k+1]=r[2*k+1]=dr-mij;
		}
		else
		{
			if (mij>=x)
				update1(st,mij,x,y,2*k);
			if (mij<y)
				update1(mij+1,dr,x,y,2*k+1);
		}
		
		if (l[2*k]==mij-st+1)
			l[k]=l[2*k]+l[2*k+1];
		else
			l[k]=l[2*k];
		if (r[2*k+1]==dr-mij)
			r[k]=r[2*k+1]+r[2*k];
		else
			r[k]=r[2*k+1];
		max[k]=l[k];
		if (max[k]<r[k]) max[k]=r[k];
		if (l[2*k+1]+r[2*k]>max[k])
			max[k]=l[2*k+1]+r[2*k];
		if (max[k]<max[2*k]) 
			max[k]=max[2*k];
		if (max[k]<max[2*k+1])
			max[k]=max[2*k+1];
	}
}




void update2( int st, int dr, int x, int y, int k)
{
	if (st>=x && dr<=y)
	{
		sw[k]=1;
		max[k]=l[k]=r[k]=dr-st+1;
	}
	else
	{
		int mij=(st+dr)/2;
		if (sw[k]==1)
		{
			sw[k]=0;
			sw[2*k]=sw[2*k+1]=1;
			if (mij>=x)
				update2 (st,mij,x,y,2*k);
			else
				max[2*k]=l[2*k]=r[2*k]=0;
			if (mij<y)
				update2 (mij+1,dr,x,y,2*k+1);
			else
				max[2*k+1]=l[2*k+1]=r[2*k+1]=0;
		}
		else
		{
			if (x<=mij)
			update2 (st,mij,x,y,2*k);
			if (mij<y)
				update2 (mij+1,dr,x,y,2*k+1);
		}
		
		if (l[2*k]==mij-st+1)
			l[k]=l[2*k]+l[2*k+1];
		else
			l[k]=l[2*k];
		if (r[2*k+1]==dr-mij)
			r[k]=r[2*k+1]+r[2*k];
		else
			r[k]=r[2*k+1];
		
		max[k]=l[k];
		if (max[k]<r[k]) max[k]=r[k];
		if (l[2*k+1]+r[2*k]>max[k])
			max[k]=l[2*k+1]+r[2*k];
		if (max[k]<max[2*k]) 
			max[k]=max[2*k];
		if (max[k]<max[2*k+1])
			max[k]=max[2*k+1];
	}
}
void solve()
{
	int n,m,i,x,y,op;
	ifstream f("hotel.in");
	ofstream g("hotel.out");
	f>>n>>m;
	sw[1]=1;
	l[1]=r[1]=max[1]=n;
	
	for (i=1;i<=m;i++)
	{
		f>>op;
		if (op==1)
			{
				f>>x>>y;
				update1(1,n,x,y,1);
			}
		else if (op==2)
			{
				f>>x>>y;
				update2(1,n,x,y,1);
			}
		else 
			g<<max[1]<<'\n';
	}
	f.close();
	g.close();
}
	
int main()
{
	solve();
	return 0;
}