Cod sursa(job #705643)

Utilizator crushackPopescu Silviu crushack Data 4 martie 2012 18:20:10
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <stdio.h>
#include <algorithm>
#define NMax 100010
using namespace std;

const char IN[]="hotel.in",OUT[]="hotel.out";

struct nod{
	int val,left,right;
} arb[5*NMax];

int N,P;
int C[5*NMax];

inline void expand(int poz,int st,int dr)
{
	if (C[poz])
	{
		if (C[poz]==1)
			arb[poz].val=arb[poz].left=arb[poz].right=0;
		else if (C[poz]==-1)
			arb[poz].val=arb[poz].left=arb[poz].right=dr-st+1;
		if (st!=dr) C[2*poz]=C[2*poz+1]=C[poz];
		C[poz]=0;
	}
}

void Update(int poz,int st,int dr,int x,int y,int v)
{
	if (x<=st && dr<=y)
	{
		C[poz]=v;
		expand(poz,st,dr);
		return;
	}
	expand(poz,st,dr);
	int m=(st+dr)>>1;
	
	if ( x<=m ) Update(2*poz,st,m,x,y,v);
	if ( y>m ) Update(2*poz+1,m+1,dr,x,y,v);
	expand(2*poz,st,m);expand(2*poz+1,m+1,dr);
	
	arb[poz].val= max(max(arb[2*poz].val,arb[2*poz+1].val),arb[2*poz].right+arb[2*poz+1].left);
	arb[poz].left= arb[2*poz].val==m-st+1 ? m-st+1+arb[2*poz+1].left : arb[2*poz].left;
	arb[poz].right= arb[2*poz+1].val==dr-m ? dr-m+arb[2*poz].right : arb[2*poz+1].right;
}

int main()
{
	int c,i,M;
	freopen(IN,"r",stdin);
	scanf("%d%d",&N,&P);
	
	C[1]=-1;
	expand(1,1,N);
	freopen(OUT,"w",stdout);
	while (P--)
	{
		scanf("%d",&c);
		
		if (c==1)
		{
			scanf("%d%d",&i,&M);
			Update(1,1,N,i,i+M-1,1);
		}
		else if (c==2)
		{
			scanf("%d%d",&i,&M);
			Update(1,1,N,i,i+M-1,-1);
		}
		else
			printf("%d\n",arb[1].val);
	}
	fclose(stdout);
	fclose(stdin);
	return 0;
}