Cod sursa(job #543858)

Utilizator c_adelinaCristescu Adelina c_adelina Data 28 februarie 2011 17:47:47
Problema Hotel Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <cstdio>

int n,q,max[1<<18],l[1<<18],r[1<<18];

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

void init(int p,int a,int b)
{
	max[p]=l[p]=r[p]=b-a+1;
	if (b-a)
	{
		int mij=(a+b)/2;
	    init(p*2,a,mij);
		init(p*2+1,mij+1,b);
	}
}

void up(int p,int a,int b,int x,int y)
{
	if ((a==x) && (b==y)) {l[p]=r[p]=max[p]=q*(x-y+1);return ;}
	int mij=(a+b)/2;
	if ((max[p]==b-a+1) || (max[p]==0))
		max[p*2]=l[p*2]=r[p*2]=mij-a+1,max[p*2+1]=l[p*2+1]=r[p*2+1]=b-mij;
	if (x>mij) up(p*2+1,mij+1,b,x,y); else
		if (y<=mij) up(p*2,a,mij,x,y); else
			up(p*2,a,mij,x,mij),up(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];
	max[p]=mx(l[p],r[p]);
	if (r[p*2]+l[p*2+1] >max[p])
		max[p]=r[p*2]+l[p*2+1];
	if (mx(max[p*2],max[p*2+1])>max[p])
		max[p]=mx(max[p*2],max[p*2+1]);
}
	
	
	
int main()
{
	int m,x,y,i;
	
	freopen("hotel.in","r",stdin);
	freopen("hotel.out","w",stdout);
	scanf("%d %d",&n,&m);
	//init(1,1,n);
	max[1]=l[1]=r[1]=n;
	while (m--)
	{
		scanf("%d",&x);
		if (x==3) printf("%d\n",max[1]); else
			if (x==1)
			{
				scanf("%d %d",&x,&y);q=0;y+=x-1;
				up(1,1,n,x,y);
			} else
			{
				scanf("%d %d",&x,&y);q=1;y+=x-1;
				up(1,1,n,x,y);
			}
	}	
				
return 0;
}