Cod sursa(job #316006)

Utilizator pcinfoCarmen Popescu pcinfo Data 17 mai 2009 23:39:36
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream f("hotel.in");
ofstream g("hotel.out");


struct nod {	int st, dr, t;
};

vector<nod> arb(300003);
vector<int> x(100001),y(100001);
int n;

void build(int k,int st, int dr)
{
	int m=(st+dr)/2,l=2*k;
	
	arb[k].st=arb[k].dr=arb[k].t=dr-st+1;
	
	if (st<dr)
	{
		build(l,st,m);
		build(l+1,m+1,dr);
	}
}

void update(int k,int st,int dr,int i,int j,int op)
// daca op=1 se ocupa camerele din intervalul i...j
// daca op=2 se elibereaza camerele din intervalul i...j
// modificarea se face pt. intervalul st...dr din arbore.
{
	int l=2*k,m=(st+dr)/2;
	
	if (i<=st && j>=dr)  // toate camerele din intervalul curent sunt ocupate sau eliberate
	{
		if (op==2) 
			arb[k].t=arb[k].st=arb[k].dr=dr-st+1;
		else
			arb[k].t=arb[k].st=arb[k].dr=0;
		return;
	}
	
	// daca toate camerele erau in starea opusa (ocupate sau libere)
	// transferam proprietatea nodurilor fii adica
	// (st,dr) tot liber inseamna ca (st,m) liber si (m+1,dr) liber
	// si updatam pe urma aceste subintervale
	
	if (arb[k].t==dr-st+1)
	{
		arb[l].t=arb[l].st=arb[l].dr=m-st+1;
		arb[l+1].t=arb[l+1].st=arb[l+1].dr=dr-m;
	}
	else
		if (arb[k].t==0)
		{
			arb[l].t=arb[l].st=arb[l].dr=0;
			arb[l+1].t=arb[l+1].st=arb[l+1].dr=0;
		}
	
		if (i<=m)
			update(l,st,m,i,j,op);
		if (j>m)
			update(l+1,m+1,dr,i,j,op);
		
		arb[k].t=max(arb[l].t,arb[l].dr+arb[l+1].st);
		arb[k].t=max(arb[k].t,arb[l+1].t);
		
		if (arb[l].t==m-st+1)
			arb[k].st=arb[l].t+arb[l+1].st;
		else
			arb[k].st=arb[l].st;
		
		if (arb[l+1].t==dr-m)
			arb[k].dr=arb[l].dr+arb[l+1].t;
		else
			arb[k].dr=arb[l+1].dr;
		
}

int main()
{
	int i,p,op,s,nr;

	f>>n>>p;
	
	build(1,1,n);
	for (i=1;i<=p;i++)
	{
		f>>op;
		if (op==3)
			g<<arb[1].t<<"\n";
		else
		{
			f>>s>>nr;
			update(1,1,n,s,s+nr-1,op);
		}
	}
	
	g.close(); 
	f.close();
	return 0;
}