Cod sursa(job #543925)

Utilizator c_adelinaCristescu Adelina c_adelina Data 28 februarie 2011 19:22:53
Problema Hotel Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <cstdio>
#define N 400002
int m[N],l[N],r[N],n,q;

inline int mx(int a,int b) { return (a>b ? a : b) ; }

void rez(int p,int a,int b,int x,int y)
{
	if ((x==a) && (y==b)) {m[p]=l[p]=r[p]=q*(y-x+1);return ;}
	int mij=(a+b)/2;
	
	if (m[p]==0) 
		m[p*2]=l[p*2]=r[p*2]=l[p*2+1]=m[p*2+1]=r[p*2+1]; else
			if (m[p]==b-a+1)
			{
				m[p*2]=l[p*2]=r[p*2]=mij-a+1;
				l[p*2+1]=m[p*2+1]=r[p*2+1]=b-mij;
			}
	
	if (x>mij) rez(p*2+1,mij+1,b,x,y); else
		if (y<=mij) rez(p*2,a,mij,x,y); else
			rez(p*2,a,mij,x,mij),rez(p*2+1,mij+1,b,mij+1,y);
	
	l[p]=l[p*2];r[p]=r[p*2+1];
	if (l[p]==mij-a+1) l[p]+=l[p*2+1];
	if (r[p]==b-mij) r[p]+=r[p*2];
	m[p]=mx(r[p*2]+l[p*2+1],mx(m[p*2],m[p*2+1]));
}
	
		

int main()
{
	int k,a,b;
	
	freopen("hotel.in","r",stdin);
	freopen("hotel.out","w",stdout);
	scanf("%d %d ",&n,&k);
	m[1]=l[1]=r[1]=n;
	while (k--)
	{
		scanf("%d",&a);
		if (a==3) printf("%d\n",m[1]); else
			if (a==1)
			{
				scanf("%d %d",&a,&b);
				b+=a-1;q=0;
				rez(1,1,n,a,b);
			} else
			{
				scanf("%d %d",&a,&b);
				b+=a-1;q=1;
				rez(1,1,n,a,b);
			}
	}
return 0;
}