Cod sursa(job #296657)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 4 aprilie 2009 23:34:26
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
using namespace std;

#include <bitset>
#define II inline
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define mp make_pair
#define IN  "hotel.in"
#define OUT "hotel.out"

int tip,x,y,N,M;
struct aint{int s,d,m;} A[1<<18];

II void scan()
{
	freopen(IN,"r",stdin);
	freopen(OUT,"w",stdout);
	
	scanf("%d%d",&N,&M);
}

II void build(int nod,int st,int dr)
{
	int ln = nod<<1;
	int rn = ln+1;
	int mij = (st+dr) >> 1;
	
	if(st == dr)
	{
		A[nod].s = A[nod].d = A[nod].m = 1;
		return;
	}	
	
	build(ln,st,mij);
	build(rn,mij+1,dr);
	
	A[nod].s = A[nod].d = A[nod].m = dr-st+1;
}

II void update(int nod,int st,int dr)
{
	int ln = nod<<1;
	int rn = ln+1;
	int mij = (st+dr) >> 1;
	
	if(x <= st && dr <= y)
	{
		A[nod].m = A[nod].s = A[nod].d = (dr - st +1) * tip;
		return;
	}
	
	if(A[nod].m == (1 - tip) * (dr - st + 1) )
	{
		A[ln].m = A[ln].s = A[ln].d = (1 - tip) * (mij - st + 1);
		A[rn].m = A[rn].s = A[rn].d = (1 - tip) * (dr - mij);
	}	
	
	if(x <= mij)
		update(ln,st,mij);
	if(y > mij)
		update(rn,mij+1,dr);
	
	A[nod].s = A[ln].s + (A[ln].s == mij-st+1 ? A[rn].s:0);
	A[nod].d = A[rn].d + (A[rn].d == dr-mij ? A[ln].d:0);
	A[nod].m = max(A[nod].s,A[nod].d);
	A[nod].m = max(max(A[ln].m,A[rn].m) ,max(A[nod].m,A[ln].d + A[rn].s) );
}

II void solve()
{
	build(1,1,N);
	
	FOR(i,1,M)
	{
		scanf("%d",&tip);
		if(tip!=3)
		{
			--tip;
			scanf("%d%d",&x,&y);
			y += x-1;
			update(1,1,N);
		}
		else
			printf("%d\n",A[1].m);
	}
}

int main()
{
	scan();
	solve();
	return 0;
}