Cod sursa(job #415681)

Utilizator otilia_sOtilia Stretcu otilia_s Data 11 martie 2010 18:27:59
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <fstream>
using namespace std;
const int MAXARB=262144;
int lmax[MAXARB],ls[MAXARB],ld[MAXARB];

void ocupa(int nod, int st, int dr, int X, int Y)
{
	if (X<=st && dr<=Y) {
							lmax[nod]=ls[nod]=ld[nod]=0;
							return;
						}
	int fs=nod<<1, fd=(nod<<1)+1, mij=(st+dr)>>1;
	if (lmax[nod]==dr-st+1) {
							  lmax[fs]=ls[fs]=ld[fs]=mij-st+1;
							  lmax[fd]=ls[fd]=ld[fd]=dr-mij;
							}
	if (X<=mij)	 ocupa(fs,st,mij,X,Y);
	if (mij<Y)   ocupa(fd,mij+1,dr,X,Y);
	lmax[nod]=max(max(lmax[fs],lmax[fd]),ld[fs]+ls[fd]);
	if (ls[fs]==mij-st+1) ls[nod]=ls[fs]+ls[fd];
	   else ls[nod]=ls[fs];
	if (ld[fd]==dr-mij) ld[nod]=ld[fs]+ld[fd];
	   else ld[nod]=ld[fd];
}


void elibereaza(int nod, int st, int dr, int X, int Y)
{
	if (X<=st && dr<=Y) {
							lmax[nod]=ls[nod]=ld[nod]=dr-st+1;
							return;
						}
	int fs=nod<<1, fd=(nod<<1)+1, mij=(st+dr)>>1;
	if (lmax[nod]==0) {
					    lmax[fs]=ls[fs]=ld[fs]=0;
						lmax[fd]=ls[fd]=ld[fd]=0;
					  }
	if (X<=mij)	elibereaza(fs,st,mij,X,Y);
	if (mij<Y)  elibereaza(fd,mij+1,dr,X,Y);
	lmax[nod]=max(max(lmax[fs],lmax[fd]),ld[fs]+ls[fd]);
	if (ls[fs]==mij-st+1) ls[nod]=ls[fs]+ls[fd];
	   else ls[nod]=ls[fs];
	if (ld[fd]==dr-mij) ld[nod]=ld[fs]+ld[fd];
	   else ld[nod]=ld[fd];
}

int main()
{
	ifstream fin("hotel.in"); ofstream fout("hotel.out");
	int n,T,top,x,y;
	fin>>n>>T;
	
	lmax[1]=ls[1]=ld[1]=n;
	while (T--)		
	{
		fin>>top;
		switch (top)
		{
		 case 3: { fout<<lmax[1]<<"\n"; break; }
		 case 1: {  fin>>x>>y;
				    ocupa(1,1,n,x,x+y-1);
				    break;
			     }
		 case 2: {  fin>>x>>y;
				    elibereaza(1,1,n,x,x+y-1);
				    break;
			     }
		}
	}
	
	fin.close(); fout.close();
	return 0;
}