Cod sursa(job #220534)

Utilizator znakeu2znakeu znakeu2 Data 11 noiembrie 2008 12:28:46
Problema Hotel Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.36 kb
//note: probabil m-am complicat pe undeva si in mod cert am niste greseli urate
// if you care about your brain do not try to understand what i wrote below
// even i don't understand it!... or do i?!

#include <stdio.h>
#define MAXN 100005

struct unknown
{
	int v,s,e,l,r,t;	
};

unknown v[4*MAXN];

int n,P,a,S,E;

inline int max(int x, int y)
{
	if (x>y)
		return x;
	return y;	
}

inline void citire()
{
	scanf("%d%d",&n,&P);
}

inline void update1(int p)
{
	if (v[p].t==2 )
	{
		int K=v[p].e-v[p].s+1;
		v[p].v=K; v[p].l=K; v[p].r=K;
		if (p<<1 <= 4*n )
			v[(p<<1)+1].t=v[p].t;
		if (p<<1 <= 4*n )
			v[(p<<1)].t=v[p].t;
		v[p].t=0;
	}
	
	if (v[p].t==1)
	{
		v[p].v=0; v[p].l=0; v[p].r=0;
		if (p<<1 <= 4*n )
			v[(p<<1)+1].t=v[p].t;
		if (p<<1 <= 4*n )
			v[(p<<1)].t=v[p].t;
		v[p].t=0;		
	}
	
	if ( v[p].s == v[p].e )
	{
		v[p].v=0; v[p].l=0; v[p].r=0; v[p].t=1;
		return;
	}
	
	if (v[p<<1].e>=S) update1(p<<1);
	if (v[(p<<1)+1].s<=E) update1( (p<<1) +1);
	
	v[p].l=v[p<<1].l;
	if (v[p<<1].l == v[p<<1].e-v[p<<1].s+1 )
		v[p].l+=v[(p<<1)+1].l;
	
	v[p].r=v[(p<<1)+1].r;
	if (v[(p<<1)+1].r == v[(p<<1)+1].e-v[(p<<1)+1].s+1 )
		v[p].r+=v[(p<<1)].r;
	
	v[p].v=max(v[(p<<1)+1].v,v[(p<<1)].v);
	v[p].v=max(v[p].v,v[(p<<1)+1].l+v[p<<1].r);
	v[p].v=max(v[p].v,v[p].l);
	v[p].v=max(v[p].v,v[p].r);	
}

inline void update2(int p)
{
	if (v[p].t==2)
	{
		int K=v[p].e-v[p].s+1;
		v[p].v=K; v[p].l=K; v[p].r=K;
		if (p<<1 <= 4*n )
			v[(p<<1)+1].t=v[p].t;
		if (p<<1 <= 4*n )
			v[(p<<1)].t=v[p].t;
		v[p].t=0;
	}
	
	if (v[p].t==1)
	{
		v[p].v=0; v[p].l=0; v[p].r=0;
		if (p<<1 <= 4*n )
			v[(p<<1)+1].t=v[p].t;
		if (p<<1 <= 4*n )
			v[(p<<1)].t=v[p].t;
		v[p].t=0;		
	}
	
	if ( v[p].s  == v[p].e)
	{
		v[p].v=v[p].e-v[p].s+1; v[p].l=v[p].e-v[p].s+1; v[p].r=v[p].e-v[p].s+1; v[p].t=2;
		return;
	}
	
	if (v[(p<<1)].e>=S) update2(p<<1);
	if (v[(p<<1)+1].s<=E) update2( (p<<1) +1);
	
	v[p].l=v[p<<1].l;
	if (v[p<<1].l == v[p<<1].e-v[p<<1].s+1 )
		v[p].l+=v[(p<<1)+1].l;
	
	v[p].r=v[(p<<1)+1].r;
	if (v[(p<<1)+1].r == v[(p<<1)+1].e-v[(p<<1)+1].s+1 )
		v[p].r+=v[(p<<1)].r;
	
	v[p].v=max(v[(p<<1)+1].v,v[(p<<1)].v);
	v[p].v=max(v[p].v,v[(p<<1)+1].l+v[p<<1].r);
	v[p].v=max(v[p].v,v[p].l);
	v[p].v=max(v[p].v,v[p].r);	
	
}

void buildarb(int i)
{
	if (i%2==0)
	{
		v[i].s = v[ i>>1 ].s;
		v[i].e = ( v[ i>>1 ].s + v[ i>>1 ].e -1)/2 + ( v[ i>>1 ].s + v[ i>>1 ].e -1)%2;
		v[i].l = v[i].e - v[i].s +1;
		v[i].r = v[i].l;
		v[i].v = v[i].l;
	}
	else
	{
		v[i].s = ( v[ i>>1 ].s + v[ i>>1 ].e -1)/2 + ( v[ i>>1 ].s + v[ i>>1 ].e -1)%2 + 1;
		v[i].e = v[ i>>1 ].e;
		v[i].l = v[i].e - v[i].s +1;
		v[i].r = v[i].l;
		v[i].v = v[i].l;
	}		
	
	if (v[i].s==v[i].e)
		return;
	buildarb(i<<1);
	buildarb((i<<1)+1);
	
	
}


void rezolv()
{
	int i;
	
	v[1].s=1; v[1].e=n; v[1].l=n; v[1].r=n; v[1].v=n;
	buildarb(2);
	buildarb(3);
	
	for (i=0; i<P; ++i)
	{
		scanf("%d",&a);
		// stuffs
		if (a==3)
			printf("%d\n",v[1].v);
		if (a==2) // pleaca turisti
		{
			scanf("%d%d",&S,&E);
			E=S+E-1;
			update2(1);			
		}
		if (a==1) // sosec turisti
		{
			scanf("%d%d",&S,&E);
			E=S+E-1;
			update1(1);			
		}
	}	
}

int main()
{
	freopen("hotel.in","r",stdin);
	freopen("hotel.out","w",stdout);
	
	citire();
	rezolv();
	
	fclose(stdin);
	fclose(stdout);	
	return 0;
}