Cod sursa(job #331907)

Utilizator AndreyPAndrei Poenaru AndreyP Data 15 iulie 2009 18:39:16
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include<stdio.h>
#define N 100010
struct hotel
{
	int st,best,dr;
};
int n,pr,ul;
bool vin;
hotel t[N<<2];
void init(int p,int u,int poz)
{
	if(p>u)
		return;
	t[poz].st=t[poz].best=t[poz].dr=u-p+1;
	if(p==u)
		return;
	init(p,(p+u)>>1,poz<<1);
	init(((p+u)>>1)+1,u,(poz<<1)+1);
}
inline int max(int x,int y,int z)
{
	if(x<y)
		x=y;
	if(x<z)
		x=z;
	return x;
}
void update(int p,int u,int poz)
{
	if(p>u)
		return;
	if(pr<=p && u<=ul)
	{
		if(vin)
			t[poz].st=t[poz].best=t[poz].dr=0;
		else
			t[poz].st=t[poz].best=t[poz].dr=u-p+1;
		return;
	}
	int mij=(p+u)>>1;
	if(t[poz].best==0)
	{
		t[poz<<1].st=t[poz<<1].best=t[poz<<1].dr=0;
		t[(poz<<1)+1].st=t[(poz<<1)+1].best=t[(poz<<1)+1].dr=0;
	}
	if(t[poz].best==u-p+1)
	{
		t[poz<<1].st=t[poz<<1].best=t[poz<<1].dr=mij-p+1;
		t[(poz<<1)+1].st=t[(poz<<1)+1].best=t[(poz<<1)+1].dr=u-mij;
	}
	if(pr<=mij)
		update(p,mij,poz<<1);
	if(mij<ul)
		update(mij+1,u,(poz<<1)+1);
	if(t[poz<<1].st==mij-p+1)
		t[poz].st=t[poz<<1].st+t[(poz<<1)+1].st;
	else
		t[poz].st=t[poz<<1].st;
	if(t[(poz<<1)+1].dr==u-mij)
		t[poz].dr=t[poz<<1].dr+t[(poz<<1)+1].dr;
	else
		t[poz].dr=t[(poz<<1)+1].dr;
	t[poz].best=max(t[poz<<1].best,t[(poz<<1)+1].best,t[poz<<1].dr+t[(poz<<1)+1].st);		
}
int main()
{
	freopen("hotel.in","r",stdin);
	freopen("hotel.out","w",stdout);
	int p;
	scanf("%d%d",&n,&p);
	init(1,n,1);
	for(; p; --p)
	{
		int cod,x,y;
		scanf("%d",&cod);
		if(cod==1)
		{
			scanf("%d%d",&x,&y);
			vin=true;
			pr=x;
			ul=x+y-1;
			update(1,n,1);
			continue;
		}
		if(cod==2)
		{
			scanf("%d%d",&x,&y);
			vin=false;
			pr=x;
			ul=x+y-1;
			update(1,n,1);
			continue;
		}
		printf("%d\n",t[1].best);
	}
	return 0;
}