Cod sursa(job #496061)

Utilizator loginLogin Iustin Anca login Data 27 octombrie 2010 18:05:52
Problema Hotel Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
# include <fstream>
# include <iostream>
# include <iomanip>
# define max(a,b) a>b?a:b
# define min(a,b) a<b?a:b
using namespace std;

struct nod{
		int l, r, c, v;
	};
int n, p;
nod v[1000000];

void mars (int st, int dr, int k)
{
	int mij=(st+dr)/2;
	v[k].v=1;
	if (st==dr)
		return;
	mars (st, mij, 2*k);
	mars (mij+1, dr, 2*k+1);
}

void mod (int st, int dr, int I, int J, int k, int val, int plin)
{
	int mij=(I+J)/2, pl;
	v[k].v=1;
	if (st==I && dr==J)
	{
		v[k].l=v[k].r=v[k].c=val;
		if (val)
			mars(I,J, k);
		v[k].v=1;
	}
	else
	{
		if (v[k].c==0)pl=0;
			else pl=1;
		if (st<=mij && dr>mij)
		{
			mod(mij+1, dr, mij+1, J, 2*k+1, min(val,dr-mij), pl);
		}
		else if (st<=mij && dr<=mij)
		{
			mod(st, dr, I, mij, 2*k, val, pl);
		}
		else if (st>mij && dr>mij)
		{
			mod(st, dr, mij+1, J, 2*k+1, val, pl);
		}
		
		if (v[2*k].v==0) v[2*k].l = v[2*k].c = v[2*k].r = mij-I+1;
		if (v[2*k+1].v==0) v[2*k+1].l = v[2*k+1].c = v[2*k+1].r = J-mij;
		
		v[k].l=v[2*k].l;
		v[k].r=v[2*k+1].r;
		v[k].c=max(v[2*k].c,v[2*k+1].c);
		
		if (v[2*k].l==mij-I+1) v[k].l += v[2*k+1].l;
		if (v[2*k+1].r==J-mij) v[k].r += v[2*k].r;
		
		v[k].c = max (v[k].c, v[2*k].r+v[2*k+1].l);
		v[k].c = max (v[k].c, (max (v[k].l, v[k].r)));
	}
}

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