Cod sursa(job #496042)

Utilizator loginLogin Iustin Anca login Data 27 octombrie 2010 17:16:35
Problema Hotel Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 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 mod (int st, int dr, int I, int J, int k, int val)
{
	int mij=(I+J)/2;
	v[k].v=1;
//	cout<<st<<" "<<dr<<" "<<I<<" "<<J<<" "<<k<<" "<<val<<endl;
	if (st==I && dr==J)
	{
		v[k].l=v[k].r=v[k].c=val;
//		cout<<"##########\n";
	}
	else
	{
		if (st<=mij && dr>mij)
		{
			mod(st, mij, I, mij, 2*k, min(mij-st+1, val));
			mod(mij+1, dr, mij+1, J, 2*k+1, min(val,dr-mij));
		}
		else if (st<=mij && dr<=mij)
			mod(st, dr, I, mij, 2*k, val);
		else if (st>mij && dr>mij)
			mod(st, dr, mij+1, J, 2*k+1, val);
		
		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);
		}
		if (c==2)
		{
			fin>>i>>m;
			mod(i, i+m-1, 1, n, 1, m);
		}
		if (c==3)
			printf("%d\n", v[1].c);		
/*	for(int i=1;i<=34;++i)cout<<setw(3)<<i;cout<<endl;
	for(int i=1;i<=34;++i)cout<<setw(3)<<v[i].l;cout<<endl;
	for(int i=1;i<=34;++i)cout<<setw(3)<<v[i].r;cout<<endl;
	for(int i=1;i<=34;++i)cout<<setw(3)<<v[i].c;cout<<endl;cout<<endl;
	*/}
	return 0;
}