Cod sursa(job #357195)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 18 octombrie 2009 13:19:07
Problema Hotel Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <stdio.h>
#define N 1<<18
struct interv
{
	int st,dr,best;
};
interv arb[N];
int n,p,tip,inc,sf;
char flag;
/*
	st=nr de camere libere consecutive care incep din st
    dr=nr de camere libere consecutive care se termin in dr
    best=nr maxim de camere consecutiv la nodul curent
*/
void op(int nod,int val)
{
	arb[nod].st=arb[nod].dr=arb[nod].best=val;
}
inline int max(int a,int b)
{
	return a>b ? a : b;
}
void cstr(int nod,int x,int y)
{
	op(nod,y-x+1);
	if (x==y)
		return;
	int mij=(x+y)>>1;
	cstr(nod<<1,x,mij);
	cstr((nod<<1)+1,mij+1,y);
}
void update(int nod,int x,int y)
{
	if (inc<=x && y<=sf)
	{
		int val=(!flag) ? 0 : y-x+1;
		op(nod,val);
	}
	if (x==y)
		return;
	int mij=(x+y)>>1;
	if (!arb[nod].best)//intervalul (x,mij)
	{
		op(nod<<1,0);
		op((nod<<1)+1,0);
	}
	if (arb[nod].best==y-x+1)//intervalul (mij+1,dr)
	{
		op(nod<<1,mij-x+1);
		op((nod<<1)+1,y-mij);
	}
	if (sf<x || inc>y)//intervalele nu se intersecteaza
		return;
	if (inc<=mij)
		update(nod<<1,x,mij);
	if (sf>mij)
		update((nod<<1)+1,mij+1,y);
	if (arb[nod<<1].st==mij-x+1)
		arb[nod].st=arb[nod<<1].st+arb[(nod<<1)+1].st;
	else
		arb[nod].st=arb[2*nod].st;
	if (arb[(nod<<1)+1].dr==y-mij)
		arb[nod].dr=arb[(nod<<1)+1].dr+arb[nod<<1].dr;
	else
		arb[nod].dr=arb[(nod<<1)+1].dr;
	arb[nod].best=max(arb[nod<<1].best,arb[(nod<<1)+1].best);
	arb[nod].best=max(arb[nod].best,arb[nod<<1].dr+arb[(nod<<1)+1].st);
}
int main()
{
	freopen("hotel.in","r",stdin);
	freopen("hotel.out","w",stdout);
	scanf("%d%d",&n,&p);
	int i;
	cstr(1,1,n);
	for (i=1; i<=p; i++)
	{
		scanf("%d",&tip);
		if (tip==1 || tip==2)
		{
			scanf("%d%d",&inc,&sf);
			sf=inc+sf-1;
			flag= (tip==1) ? 0 : 1;
			update(1,1,n);
		}
		if (tip==3)
			printf("%d\n",arb[1].best);
	}
	return 0;
}