Cod sursa(job #792748)

Utilizator alexalghisiAlghisi Alessandro Paolo alexalghisi Data 29 septembrie 2012 17:39:03
Problema Hotel Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <cstdio>
#include <algorithm>
using namespace std;

int a,b,n;
int arb[400005];
int dr[400005];
int st[400005];

void update1(int nod,int left,int right,int p)
{
	if(left>=a && b>=right)
	{
		//printf("left : %d right : %d \n",left,right);
		if(p==1) p=right-left+1;
		
		arb[nod]=p;
		st[nod]=p;
		dr[nod]=p;
		return;
	}
	int mij=(left+right)/2;
	//cum ?
	if(arb[nod]==0)
	{
		arb[2*nod]=0;
		arb[2*nod+1]=0;
		st[2*nod]=0;
		st[2*nod+1]=0;
		dr[2*nod]=0;
		dr[2*nod+1]=0;
	}
	if(arb[nod]==right-left+1)
	{
		arb[2*nod]=dr[2*nod]=st[2*nod]=mij-left+1;
		arb[2*nod+1]=dr[2*nod+1]=st[2*nod+1]=right-mij;
	}
	if(a<=mij) update1(2*nod,left,mij,p);
	if(b>mij) update1(2*nod+1,mij+1,right,p);
	
	arb[nod]=max( arb[2*nod] , max ( arb[2*nod+1] , dr[2*nod]+st[2*nod+1] ) );
	st[nod]= (st[2*nod]< (mij-left+1))?st[2*nod]:(st[2*nod]+st[2*nod+1]);
	dr[nod]= (dr[2*nod+1]< (right-mij))?dr[2*nod+1]:(dr[2*nod]+dr[2*nod+1]);
	
	return;
}

void update(int nod,int left,int right,int poz)
{
	if(left==right)
	{
		arb[nod]=1;
		st[nod]=1;
		dr[nod]=1;
		return;
	}
	int mij=(left+right)/2;
	if(poz<=mij) update(2*nod,left,mij,poz);
	else update(2*nod+1,mij+1,right,poz);
	
	arb[nod]=arb[2*nod]+arb[2*nod+1];
	st[nod]=arb[nod];
	dr[nod]=arb[nod];
	return;
}

int main()
{
	int m;
	freopen("hotel.in","r", stdin);
	scanf("%d %d",&n,&m);
	for(int i=1;i<=n;i++)
		update(1,1,n,i);
		
	for(int i=1;i<=m;i++)
	{
		int tip;
		scanf("%d",&tip);
		if(tip==1 || tip==2)
		{
			scanf("%d %d",&a,&b);
			b=a+b-1;
			if(tip==1)
				update1(1,1,n,0);
			else
				update1(1,1,n,1);
	//		printf("t: %d\n",arb[1]);
		}
		else 
 		{
			printf("%d\n",arb[1]);
		}
	}		
		
		
	return 0;
}