Cod sursa(job #1047098)

Utilizator Kira96Denis Mita Kira96 Data 3 decembrie 2013 21:56:52
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
#include<fstream>
#define N 400100
using namespace std;
ifstream f("hotel.in");
ofstream g("hotel.out");
int M[N],S[N],D[N],a,b,k,l,i,n,m,t;
void p(int st,int dr,int po)
{
	if(st==dr)
	{
		S[po]=D[po]=M[po]=dr-st+1;
		return ;
	}
	int mij=(st+dr)>>1;
	p(st,mij,po<<1);
	p(mij+1,dr,(po<<1)+1);
	S[po]=D[po]=M[po]=S[po<<1]+S[(po<<1)+1];
}
void u(int st,int dr,int po)
{
	int mij=(st+dr)>>1;
	if(st!=dr)
	{
	if(M[po]==0)
		M[(po<<1)]=M[(po<<1)+1]=S[(po<<1)]=S[(po<<1)+1]=D[(po<<1)]=D[(po<<1)+1]=0;
	if(M[po]==dr-st+1)
	{
		M[po<<1]=D[po<<1]=S[po<<1]=mij-st+1;
		M[(po<<1)+1]=D[(po<<1)+1]=S[(po<<1)+1]=dr-mij;
	}
	}
	if(st>=a&&dr<=b)
	{
		S[po]=D[po]=M[po]=0;
		return ;
	}
	if(a<=mij)
		u(st,mij,po<<1);
	if(b>mij)
		u(mij+1,dr,(po<<1)+1);
	if(S[(po<<1)]==mij-st+1)
		S[po]=S[(po<<1)]+S[(po<<1)+1];
	else
		S[po]=S[(po<<1)];
	if(D[(po<<1)+1]==dr-mij)
		D[po]=D[(po<<1)]+D[(po<<1)+1];
	else
		D[po]=D[(po<<1)+1];
	M[po]=max(M[(po<<1)],max(M[(po<<1)+1],D[(po<<1)]+S[(po<<1)+1]));
}
void U(int st,int dr,int po)
{
	int mij=(st+dr)>>1;
	if(st!=dr)
	{
	if(M[po]==0)
		M[(po<<1)]=M[(po<<1)+1]=S[(po<<1)]=S[(po<<1)+1]=D[(po<<1)]=D[(po<<1)+1]=0;
	if(M[po]==dr-st+1)
	{
		M[po<<1]=D[po<<1]=S[po<<1]=mij-st+1;
		M[(po<<1)+1]=D[(po<<1)+1]=S[(po<<1)+1]=dr-mij;
	}
	}
	if(st>=a&&dr<=b)
	{
		S[po]=D[po]=M[po]=dr-st+1;
		return ;
	}
	if(a<=mij)
		U(st,mij,po<<1);
	if(b>mij)
		U(mij+1,dr,(po<<1)+1);
	if(S[(po<<1)]==mij-st+1)
		S[po]=S[(po<<1)]+S[(po<<1)+1];
	else
		S[po]=S[(po<<1)];
	if(D[(po<<1)+1]==dr-mij)
		D[po]=D[(po<<1)]+D[(po<<1)+1];
	else
		D[po]=D[(po<<1)+1];
	M[po]=max(M[(po<<1)],max(M[(po<<1)+1],D[(po<<1)]+S[(po<<1)+1]));
}
int main ()
{
	f>>n>>m;
	p(1,n,1);
	for(i=1;i<=m;++i)
	{
		f>>t;
		if(t==1)
		{
			f>>k>>l;
			a=k;
			b=k+l-1;
			u(1,n,1);
		}
		if(t==2)
		{
			f>>k>>l;
			a=k;
			b=k+l-1;
			if(a==9&&b==10)
			{
				a++;
				a--;
			}
			U(1,n,1);
		}
		if(t==3)
			g<<M[1]<<"\n";
	}
	return 0;
}