Cod sursa(job #580722)

Utilizator doru.nituNitu Doru Constantin doru.nitu Data 13 aprilie 2011 13:46:10
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.14 kb
#include<cstdio>
#include<bitset>

using namespace std;

int i,j,n,m,a[300010],st[300010],dr[300010],ma[300010];

int fol[300010];

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

void build(int i,int s,int d)
{
	if(s>=d)
	{ 
		st[i]=dr[i]=ma[i]=1;
		fol[i]=1;
		return ;
	}
	
	int m=(s+d)/2,fiu1=i*2,fiu2=i*2+1;
	build(fiu1,s,m);
	build(fiu2,m+1,d);
	
	if(fol[fiu1]&&fol[fiu2]&&a[fiu1]==a[fiu2]) fol[i]=1;
	else fol[i]=0;
	
	st[i]=st[fiu1];
	if(fol[fiu1]&&!a[fiu1])	st[i]+=st[fiu2];
	
	dr[i]=dr[fiu2];
	if(fol[fiu2]&&!a[fiu2]) dr[i]+=dr[fiu1];
	
	ma[i]=max(ma[fiu1],ma[fiu2]);
	ma[i]=max(ma[i],st[i]);
	ma[i]=max(ma[i],dr[i]);
	ma[i]=max(ma[i],dr[fiu1]+st[fiu2]);
}
	
void update(int i,int s,int d,int p,int q,int val)
{
	if(p<=s&&d<=q)
	{
		a[i]=val;
		fol[i]=1;
		
		if(a[i])	st[i]=dr[i]=ma[i]=0;
		else 	st[i]=dr[i]=ma[i]=d-s+1;
		return ;
	}
	
	int m=(s+d)/2,fiu1=i*2,fiu2=i*2+1;
	
	if(fol[i])
	{
		fol[i]=0;
		fol[fiu1]=fol[fiu2]=1;
		a[fiu1]=a[fiu2]=a[i];
		
		if(!a[i])
		{
			st[fiu1]=dr[fiu1]=ma[fiu1]=m-s+1;
			st[fiu2]=dr[fiu2]=ma[fiu2]=d-m;
		}
		else
		{
			st[fiu1]=dr[fiu1]=ma[fiu1]=0;
			st[fiu2]=dr[fiu2]=ma[fiu2]=0;
		}
	}
	
	if(p<=m) update(fiu1,s,m,p,q,val);
	if(q>m) update(fiu2,m+1,d,p,q,val);
	
	if(fol[fiu1]&&fol[fiu2]&&a[fiu1]==a[fiu2]) fol[i]=1,a[i]=a[fiu1];
	else fol[i]=0;
	
	st[i]=st[fiu1];
	if(fol[fiu1]&&!a[fiu1])	st[i]+=st[fiu2];
	
	dr[i]=dr[fiu2];
	if(fol[fiu2]&&!a[fiu2]) dr[i]+=dr[fiu1];
	
	ma[i]=max(ma[fiu1],ma[fiu2]);
	ma[i]=max(ma[i],st[i]);
	ma[i]=max(ma[i],dr[i]);
	ma[i]=max(ma[i],dr[fiu1]+st[fiu2]);
}

void afis(int a[])
{
	for(int i=1;i<=35;++i) printf("%d ",a[i]);
	printf("\n");
}

int main()
{
	freopen("hotel.in","r",stdin);
	freopen("hotel.out","w",stdout);
	
	scanf("%d%d",&n,&m);
	
	build(1,1,n);
	
	for(i=1;i<=m;++i)
	{
		int tip,x,y;
		
		scanf("%d",&tip);
		
		if(tip==3) printf("%d\n",ma[1]);
		else if(tip==2)
		{
			scanf("%d%d",&x,&y);
			update(1,1,n,x,x+y-1,0);
		}
		else
		{
			scanf("%d%d",&x,&y);
			update(1,1,n,x,x+y-1,1);
		}
	}
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
}