Cod sursa(job #199682)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 20 iulie 2008 09:29:30
Problema Hotel Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.63 kb
#include<stdio.h>
#define N 1<<18
#define fs nod<<1
#define fd (nod<<1)|1
struct stare{ long pc;long uc;long ls;long le;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);
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 mm=(pp+mm)>>1;
	x[nod].pc=pp;
	x[nod].uc=uu;
	x[nod].ls=uu-pp+1;
	x[nod].le=uu-pp+1;
	x[nod].li=0;
	x[nod].s=0;
	if(pp==uu)return;
	mm=(pp+uu)>>1;
	init(fs,pp,mm);
	init(fd,mm+1,uu);
}
void ocupa(long nod)
{
    if(a<=x[nod].pc&&x[nod].uc<=b)
    {  x[nod].ls=0;x[nod].le=0;x[nod].li=0;x[nod].lm=0;x[nod].s=1;return;}
    if(a>x[nod].uc)return;
    if(b<x[nod].pc)return;
    ocupa(fs);
    ocupa(fd);
    if(x[fs].s==0)
    { if(x[fd].s==1)
      { x[nod].ls=x[fs].ls;
	x[nod].le=0;
	x[nod].li=0;
	x[nod].lm=x[fs].ls;
	x[nod].s=2;
	return;
      }
      if(x[fd].s==2)
      { x[nod].ls=x[fs].ls+x[fd].ls;
	x[nod].le=x[fd].le;
	x[nod].li=x[fd].li;
	x[nod].lm=(x[nod].ls>x[nod].le)?x[nod].ls:x[nod].le;
	x[nod].lm=(x[nod].lm>x[nod].li)?x[nod].lm:x[nod].li;
	x[nod].s=2;
	return;
      }
      x[nod].ls=x[nod].le=x[nod].li=x[nod].lm=x[nod].uc-x[nod].pc+1;
      x[nod].s=0;
      return;
    }
    if(x[fs].s==1)
    { if(x[fd].s==0)
      { x[nod].ls=0;
	x[nod].le=x[fd].le;
	x[nod].li=0;
	x[nod].lm=x[fd].lm;
	x[nod].s=2;
	return;
      }
      if(x[fd].s==2)
      { x[nod].ls=0;
	x[nod].le=x[fd].le;
	x[nod].li=(x[fd].li>x[fd].ls)?x[fd].li:x[fd].ls;
	x[nod].lm=(x[nod].li>x[nod].le)?x[nod].li:x[nod].le;
	x[nod].s=2;
	return;
      }
      x[nod].ls=x[nod].le=x[nod].li=x[nod].lm=0;
      x[nod].s=0;
      return;
    }
    if(x[fd].s==0)
    { x[nod].ls=x[fs].ls;
      x[nod].le=x[fs].le+x[fd].lm;
      x[nod].li=x[fs].li;
      x[nod].lm=(x[nod].ls>x[nod].le)?x[nod].ls:x[nod].le;
      x[nod].lm=(x[nod].lm>x[nod].li)?x[nod].lm:x[nod].li;
      x[nod].s=2;
      return;
    }
    if(x[fd].s==1)
    { x[nod].ls=x[fs].ls;
      x[nod].le=0;
      x[nod].li=(x[fs].li>x[fs].le)?x[fs].li:x[fs].le;
      x[nod].lm=(x[nod].ls>x[nod].li)?x[nod].ls:x[nod].li;
      x[nod].s=2;
      return;
    }
    x[nod].ls=x[fs].ls;
    x[nod].le=x[fd].le;
    x[nod].li=x[fs].le+x[fd].ls;
    x[nod].li=(x[nod].li>x[fs].li)?x[nod].li:x[fs].li;
    x[nod].li=(x[nod].li>x[fd].li)?x[nod].li:x[fd].li;
    x[nod].s=2;
}
void elibereaza(long nod)
{
    if(a<=x[nod].pc&&x[nod].uc<=b)
    {  x[nod].ls=x[nod].le=x[nod].li=x[nod].lm=x[nod].uc-x[nod].pc+1;
       x[nod].s=1;return;
    }
    if(a>x[nod].uc)return;
    if(b<x[nod].pc)return;
    ocupa(fs);
    ocupa(fd);
    if(x[fs].s==0)
    { if(x[fd].s==1)
      { x[nod].ls=x[fs].ls;
	x[nod].le=0;
	x[nod].li=0;
	x[nod].lm=x[fs].ls;
	x[nod].s=2;
	return;
      }
      if(x[fd].s==2)
      { x[nod].ls=x[fs].ls+x[fd].ls;
	x[nod].le=x[fd].le;
	x[nod].li=x[fd].li;
	x[nod].lm=(x[nod].ls>x[nod].le)?x[nod].ls:x[nod].le;
	x[nod].lm=(x[nod].lm>x[nod].li)?x[nod].lm:x[nod].li;
	x[nod].s=2;
	return;
      }
      x[nod].ls=x[nod].le=x[nod].li=x[nod].lm=x[nod].uc-x[nod].pc+1;
      x[nod].s=0;
      return;
    }
    if(x[fs].s==1)
    { if(x[fd].s==0)
      { x[nod].ls=0;
	x[nod].le=x[fd].le;
	x[nod].li=0;
	x[nod].lm=x[fd].lm;
	x[nod].s=2;
	return;
      }
      if(x[fd].s==2)
      { x[nod].ls=0;
	x[nod].le=x[fd].le;
	x[nod].li=(x[fd].li>x[fd].ls)?x[fd].li:x[fd].ls;
	x[nod].lm=(x[nod].li>x[nod].le)?x[nod].li:x[nod].le;
	x[nod].s=2;
	return;
      }
      x[nod].ls=x[nod].le=x[nod].li=x[nod].lm=0;
      x[nod].s=0;
      return;
    }
    if(x[fd].s==0)
    { x[nod].ls=x[fs].ls;
      x[nod].le=x[fs].le+x[fd].lm;
      x[nod].li=x[fs].li;
      x[nod].lm=(x[nod].ls>x[nod].le)?x[nod].ls:x[nod].le;
      x[nod].lm=(x[nod].lm>x[nod].li)?x[nod].lm:x[nod].li;
      x[nod].s=2;
      return;
    }
    if(x[fd].s==1)
    { x[nod].ls=x[fs].ls;
      x[nod].le=0;
      x[nod].li=(x[fs].li>x[fs].le)?x[fs].li:x[fs].le;
      x[nod].lm=(x[nod].ls>x[nod].li)?x[nod].ls:x[nod].li;
      x[nod].s=2;
      return;
    }
    x[nod].ls=x[fs].ls;
    x[nod].le=x[fd].le;
    x[nod].li=x[fs].le+x[fd].ls;
    x[nod].li=(x[nod].li>x[fs].li)?x[nod].li:x[fs].li;
    x[nod].li=(x[nod].li>x[fd].li)?x[nod].li:x[fd].li;
    x[nod].s=2;
}