Cod sursa(job #754697)

Utilizator danalex97Dan H Alexandru danalex97 Data 2 iunie 2012 22:03:31
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.12 kb
#include <cstdio>
using namespace std;

#define MaxN 100050

#define fs(x)     ((x)*2)
#define fd(x)     ((x)*2+1)

struct Nod{int left,right,all;};

Nod Arb[4*MaxN];

int N,P,i,A,B,j,Op;

void init(int nod,int st,int dr)
{
      Arb[nod].left=Arb[nod].right=Arb[nod].all=dr-st+1;
      if(st==dr)
            return;
      int div=(st+dr)/2;
      init(fs(nod),st,div);
      init(fd(nod),div+1,dr);
}

inline int Maxim(int a,int b)
{   return (a>b) ? a : b ; }

void Update(int nod,int st,int dr)
{
      int Val;
      if(A<=st && dr<=B)
      {
            if(Op)
                  Val=dr-st+1;
            else
                  Val=0;
            Arb[nod].left=Arb[nod].right=Arb[nod].all=Val;
            return;
      }

      int div=(st+dr)/2;
      if(Arb[nod].all==dr-st+1)
      {
            Arb[fs(nod)].left=Arb[fs(nod)].right=Arb[fs(nod)].all=div-st+1;
            Arb[fd(nod)].left=Arb[fd(nod)].right=Arb[fd(nod)].all=dr-div;
      }
      if(!Arb[nod].all)
      {
            Arb[fs(nod)].left=Arb[fs(nod)].right=Arb[fs(nod)].all=0;
            Arb[fd(nod)].left=Arb[fd(nod)].right=Arb[fd(nod)].all=0;
      }

      if(A<=div)
            Update(fs(nod),st,div);
      if(div<B)
            Update(fd(nod),div+1,dr);

      Arb[nod].left=Arb[fs(nod)].left;
      Arb[nod].right=Arb[fd(nod)].right;
      Arb[nod].all=Maxim(Arb[fs(nod)].all,Arb[fd(nod)].all);
      Arb[nod].all=Maxim(Arb[nod].all,Arb[fs(nod)].right+Arb[fd(nod)].left);
      if(Arb[nod].left==div-st+1)
            Arb[nod].left+=Arb[fd(nod)].left;
      if(Arb[nod].right==dr-div)
            Arb[nod].right+=Arb[fs(nod)].right;
}

int main()
{
      freopen("hotel.in","r",stdin);
      freopen("hotel.out","w",stdout);
      scanf("%d%d",&N,&P);

      init(1,1,N);

      for(i=1;i<=P;i++)
      {
            scanf("%d",&Op);
            if(Op==3)
                  printf("%d\n",Arb[1].all);
            else
            {
                  scanf("%d%d",&A,&B);
                  B=A+B-1;
                  Op--;
                  Update(1,1,N);
            }
      }
      return 0;
}