Cod sursa(job #168478)

Utilizator mike4problemsRadu Gabriel mike4problems Data 31 martie 2008 14:45:10
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include<fstream>
using namespace std;

ifstream fin("hotel.in");
ofstream fout("hotel.out");

#define Max 100000

int sol[5*Max],n,start,end;
int sst[5*Max],sdr[5*Max];

void modi1(int,int,int);
void modi2(int,int,int);

int main()
{
	int t,k;
	fin>>n>>t;
	sol[1]=sst[1]=sdr[1]=n;
	while(t--)
	{
		fin>>k;
		if(k<3)
		{
			fin>>start>>end;
			end=start+end-1;
			if(k==1) modi1(1,1,n);
			else modi2(1,1,n);
		}
		else fout<<sol[1]<<'\n';
	}
	return 0;
}

void modi1(int k,int i,int j)
{
	if(start<=i&&j<=end)
	{
		sol[k]=sst[k]=sdr[k]=0;
		return;
	}
	int mij=(i+j)/2;
	if(sol[k]==j-i+1) 
	{
		sol[2*k]=sst[2*k]=sdr[2*k]=mij-i+1;
		sol[2*k+1]=sst[2*k+1]=sdr[2*k+1]=j-mij;
	}
	if(start<=mij) modi1(2*k,i,mij);
	if(mij<end) modi1(2*k+1,mij+1,j);
	sol[k]=max(sol[2*k],sol[2*k+1]);
	sol[k]=max(sol[k],sdr[2*k]+sst[2*k+1]);
	sst[k]=sst[2*k];
	if(mij-i+1==sst[2*k])
		sst[k]+=sst[2*k+1];
	sdr[k]=sdr[2*k+1];
	if(j-mij==sdr[2*k+1])
		sdr[k]+=sdr[2*k];
}

void modi2(int k,int i,int j)
{
	if(start<=i&&j<=end)
	{
		sol[k]=sst[k]=sdr[k]=j-i+1;
		return;
	}
	if(sol[k]==0)
	{
		sol[2*k]=sst[2*k]=sdr[2*k]=0;
		sol[2*k+1]=sst[2*k+1]=sdr[2*k+1]=0;
	}	
	int mij=(i+j)/2;
	if(start<=mij) modi2(2*k,i,mij);
	if(mij<end) modi2(2*k+1,mij+1,j);
	sol[k]=max(sol[2*k],sol[2*k+1]);
	sol[k]=max(sol[k],sdr[2*k]+sst[2*k+1]);
	sst[k]=sst[2*k];
	if(mij-i+1==sst[2*k])
		sst[k]+=sst[2*k+1];
	sdr[k]=sdr[2*k+1];
	if(j-mij==sdr[2*k+1])
		sdr[k]+=sdr[2*k];
}