Cod sursa(job #199712)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 20 iulie 2008 11:58:42
Problema Hotel Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.04 kb
#include<stdio.h>
#define N 1<<18
struct stare{ long pc;long uc;long ls;long ld;long li;long lm;long s;};
stare x[N];
long n,p,cod,a,b;
void init ();
void citire();
void init(long nod,long pp,long uu);
void ocupa(long nod);
void elibereaza(long nod);
void remake(long nod);
int main()
{	citire();
	init(1,1,n);
	for (;p;p--)
	{  scanf("%ld",&cod);
	   if(cod==3){printf("%ld\n",x[1].lm);continue;}
	   scanf("%ld%ld",&a,&b);
	   b+=a-1;
	   if(cod==1)ocupa(1);
	   else elibereaza(1);
	}
	return 0;
}
void citire()
{
	freopen("hotel.in","r",stdin);
	freopen("hotel.out","w",stdout);
	scanf("%ld%ld",&n,&p);
}
void init(long nod,long pp,long uu)
{       long fs,fd,mm;
	mm=(pp+uu)>>1;fs=nod<<1;fd=fs+1;
	x[nod].pc=pp;x[nod].uc=uu;
	x[nod].ls=x[nod].ld=x[nod].lm=uu-pp+1;x[nod].li=0;
	if(pp==uu)return;
	mm=(pp+uu)>>1;init(fs,pp,mm);init(fd,mm+1,uu);
}
void ocupa(long nod)
{   long fs,fd;
    fs=nod<<1;fd=fs+1;
    if(a<=x[nod].pc&&x[nod].uc<=b)
    {  x[nod].ls=x[nod].ld=x[nod].li=x[nod].lm=0;x[nod].s=1;
       if(x[nod].pc==x[nod].uc)return;
       ocupa(fs);ocupa(fd);return;}
    if(a>x[nod].uc)return;
    if(b<x[nod].pc)return;
    ocupa(fs);
    ocupa(fd);
    remake(nod);
}
void elibereaza(long nod)
{   long fs,fd;
    fs=nod<<1;fd=fs+1;
    if(a<=x[nod].pc&&x[nod].uc<=b)
    {  x[nod].ls=x[nod].ld=x[nod].lm=x[nod].uc-x[nod].pc+1;
       x[nod].li=x[nod].s=0;
       if(x[nod].pc==x[nod].pc)return;
       elibereaza(fs);elibereaza(fd);return;
    }
    if(a>x[nod].uc)return;
    if(b<x[nod].pc)return;
    elibereaza(fs);
    elibereaza(fd);
    remake(nod);
}
void remake(long nod)
{
	long fs,fd,ss,sd;
	fs=nod<<1;fd=fs+1;ss=x[fs].s;sd=x[fd].s;
	x[nod].s=(ss==sd)?ss:2;
	x[nod].ls=(ss)?x[fs].ls:x[fs].ls+x[fd].ls;
	x[nod].ld=(sd)?x[fd].ld:x[fs].ld+x[fd].ld;
	x[nod].li=(x[fs].li>x[fd].li)?x[fs].li:x[fd].li;
	if(ss+sd==4)
	 if(x[nod].li<x[fs].ld+x[fd].ls)
	  x[nod].li=x[fs].ld+x[fd].ls;
	x[nod].lm=(x[nod].ls>x[nod].ld)?x[nod].ls:x[nod].ld;
	x[nod].lm=(x[nod].lm>x[nod].li)?x[nod].lm:x[nod].li;
}