Cod sursa(job #496360)

Utilizator loginLogin Iustin Anca login Data 28 octombrie 2010 17:47:22
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
# include <fstream>
# include <cstdlib>
# define DIM 500000
# define max(a,b) a>b?a:b
using namespace std;
int n, p, l[DIM], r[DIM], a[DIM];

void init (int k, int st, int dr)
{
	if (st==dr)
	{
		a[k]=l[k]=r[k]=1;
		return;
	}
	int mij=(st+dr)/2;
	init(2*k, st, mij);
	init(2*k+1, mij+1, dr);
	a[k]=l[k]=r[k]=dr-st+1;
}

void upd (int k, int st, int dr, int I, int J, int v)
{
	if (st<=I && dr>=J)
	{
		a[k]=l[k]=r[k]=v*(J-I+1);
		return;
	}
	int mij=(I+J)/2;
	
	if (a[k]==0){a[2*k]=l[2*k]=r[2*k]=0;a[2*k+1]=l[2*k+1]=r[2*k+1]=0;}
	if (a[k]==J-I+1){a[2*k]=l[2*k]=r[2*k]=mij-I+1;a[2*k+1]=l[2*k+1]=r[2*k+1]=J-mij;}
	
	if (st<=mij)upd(2*k, st, dr, I, mij, v);
	if (dr>mij)upd(2*k+1, st, dr, mij+1, J, v);
	
	l[k]=l[2*k];
	if (l[2*k]==mij-I+1)l[k]+=l[2*k+1];
	r[k]=r[2*k+1];
	if (r[2*k+1]==J-mij)r[k]+=r[2*k];
	a[k]=max(r[2*k]+l[2*k+1], (max(a[2*k],a[2*k+1])));
}

int main ()
{
	ifstream fin ("hotel.in");
	freopen("hotel.out", "w", stdout);
	fin>>n>>p;
	int c, i, m;
	init(1, 1, n);
	for(;p--;)
	{
		fin>>c;
		if (c==1)
		{
			fin>>i>>m;
			upd(1, i, i+m-1, 1, n, 0);
		}
		if (c==2)
		{
			fin>>i>>m;
			upd(1, i, i+m-1, 1, n, 1);
		}
		if (c==3)
			printf("%d\n", a[1]);
	}
	return 0;
}