Cod sursa(job #213612)

Utilizator madmanjonesJones the one madmanjones Data 10 octombrie 2008 16:31:33
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 5.09 kb
#include<stdio.h>
#define N 1<<18
#define liber 0
#define ocupat 1
#define mixt 2
#define ocupare 1
#define eliberare 2
#define intrebare 3
long stanga[N],dreapta[N],maxim[N],stare[N],
n,p,operatie,inceput,sfarsit,cate;
void citeste(long *variabila);
void citire();
void ocupa(long nod,long prima,long ultima);
void elibereaza(long nod,long prima,long ultima);
int main()
{	citire();
        for(;p;p--)
	{  citeste(&operatie);
	   if(operatie==intrebare)
	    { printf("%ld\n",maxim[1]);continue;}
	   citeste(&inceput),citeste(&cate);
	   sfarsit=inceput+cate-1;
	   if(operatie==ocupare)ocupa(1,1,n);
	   if(operatie==eliberare) elibereaza(1,1,n);
	}
	return 0;
}
void citire()
{
	freopen("hotel.in","r",stdin);
	freopen("hotel.out","w",stdout);
	scanf("%ld%ld",&n,&p);
	maxim[1]=n;stare[1]=liber;
}
void citeste(long *variabila)
{
	scanf("%ld",variabila);
}
void ocupa(long nod,long prima,long ultima)
{   long fs,fd,mijloc,max1,max2,max3,max4;
    fs=nod<<1;fd=fs+1;
    if(inceput<=prima&&ultima<=sfarsit)
    {  maxim[nod]=0;stare[nod]=ocupat;
       return;
    }
    mijloc=(prima+ultima)>>1;
    if(stare[nod]==liber)
    { stare[fs]=liber;maxim[fs]=mijloc-prima+1;
      stare[fd]=liber;maxim[fd]=ultima-mijloc;
    }
    stare[nod]=mixt;
    if(inceput<=mijloc)ocupa(fs,prima,mijloc);
    if(sfarsit>mijloc)ocupa(fd,mijloc+1,ultima);
    if(stare[fs]==liber)
     { if(stare[fd]==liber)
       { stare[nod]=liber;maxim[nod]=maxim[fs]+maxim[fd];return;}
       if(stare[fd]==ocupat)
       { stanga[nod]=maxim[fs];dreapta[nod]=0;maxim[nod]=maxim[fs];return;}
       if(stare[fd]==mixt)
       { stanga[nod]=maxim[fs]+stanga[fd];dreapta[nod]=dreapta[fd];
	 maxim[nod]=(stanga[nod]>dreapta[nod])?stanga[nod]:dreapta[nod];
	 maxim[nod]=(maxim[nod]>maxim[fd])?maxim[nod]:maxim[fd];return;
       }
     }
    if(stare[fs]==mixt)
    { if(stare[fd]==liber)
      { stanga[nod]=stanga[fs];dreapta[nod]=dreapta[fs]+maxim[fd];
	maxim[nod]=(stanga[nod]>dreapta[nod])?stanga[nod]:dreapta[nod];
	maxim[nod]=(maxim[nod]>maxim[fs])?maxim[nod]:maxim[fs];
      }
      if(stare[fd]==mixt)
      { stanga[nod]=stanga[fs];dreapta[nod]=dreapta[fd];
	max1=stanga[fs];max2=dreapta[fd];max3=dreapta[fs]+stanga[fd];
	max4=(maxim[fs]>maxim[fd])?maxim[fs]:maxim[fd];
	max1=(max1>max3)?max1:max3;
	max2=(max2>max4)?max2:max4;
	maxim[nod]=(max1>max2)?max1:max2;
      }
      if(stare[fd]==ocupat)
      { stanga[nod]=stanga[fs];dreapta[nod]=0;
	maxim[nod]=(stanga[fs]>dreapta[fs])?stanga[fs]:dreapta[fs];
	maxim[nod]=(maxim[nod]>maxim[fs])?maxim[nod]:maxim[fs];
      }
    }
    if(stare[fs]==ocupat)
    { if(stare[fd]==liber)
      { stanga[nod]=0;dreapta[nod]=maxim[fd];maxim[nod]=maxim[fd];}
      if(stare[fd]==mixt)
      { stanga[nod]=0;dreapta[nod]=dreapta[fd];
	maxim[nod]=(stanga[fd]>dreapta[fd])?stanga[fd]:dreapta[fd];
	maxim[nod]=(maxim[nod]>maxim[fd])?maxim[nod]:maxim[fd];
      }
      if(stare[fd]==ocupat)
      { stare[nod]=ocupat;maxim[nod]=0;}
    }
}
void elibereaza(long nod,long prima,long ultima)
{   long fs,fd,mijloc,max1,max2,max3,max4;
    fs=nod<<1;fd=fs+1;
    if(inceput<=prima&&ultima<=sfarsit)
    {  maxim[nod]=ultima-prima+1;stare[nod]=liber;
       return;
    }
    mijloc=(prima+ultima)>>1;
    if(stare[nod]==ocupat)
    { stare[fs]=ocupat;maxim[fs]=0;
      stare[fd]=ocupat;maxim[fd]=0;
    }
    stare[nod]=mixt;
    if(inceput<=mijloc)elibereaza(fs,prima,mijloc);
    if(sfarsit>mijloc)elibereaza(fd,mijloc+1,ultima);
    if(stare[fs]==liber)
     { if(stare[fd]==liber)
       { stare[nod]=liber;maxim[nod]=maxim[fs]+maxim[fd];return;}
       if(stare[fd]==ocupat)
       { stanga[nod]=maxim[fs];dreapta[nod]=0;maxim[nod]=maxim[fs];return;}
       if(stare[fd]==mixt)
       { stanga[nod]=maxim[fs]+stanga[fd];dreapta[nod]=dreapta[fd];
	 maxim[nod]=(stanga[nod]>dreapta[nod])?stanga[nod]:dreapta[nod];
	 maxim[nod]=(maxim[nod]>maxim[fd])?maxim[nod]:maxim[fd];return;
       }
     }
    if(stare[fs]==mixt)
    { if(stare[fd]==liber)
      { stanga[nod]=stanga[fs];dreapta[nod]=dreapta[fs]+maxim[fd];
	maxim[nod]=(stanga[nod]>dreapta[nod])?stanga[nod]:dreapta[nod];
	maxim[nod]=(maxim[nod]>maxim[fs])?maxim[nod]:maxim[fs];
      }
      if(stare[fd]==mixt)
      { stanga[nod]=stanga[fs];dreapta[nod]=dreapta[fd];
	max1=stanga[fs];max2=dreapta[fd];max3=dreapta[fs]+stanga[fd];
	max4=(maxim[fs]>maxim[fd])?maxim[fs]:maxim[fd];
	max1=(max1>max3)?max1:max3;
	max2=(max2>max4)?max2:max4;
	maxim[nod]=(max1>max2)?max1:max2;
      }
      if(stare[fd]==ocupat)
      { stanga[nod]=stanga[fs];dreapta[nod]=0;
	maxim[nod]=(stanga[fs]>dreapta[fs])?stanga[fs]:dreapta[fs];
	maxim[nod]=(maxim[nod]>maxim[fs])?maxim[nod]:maxim[fs];
      }
    }
    if(stare[fs]==ocupat)
    { if(stare[fd]==liber)
      { stanga[nod]=0;dreapta[nod]=maxim[fd];maxim[nod]=maxim[fd];}
      if(stare[fd]==mixt)
      { stanga[nod]=0;dreapta[nod]=dreapta[fd];
	maxim[nod]=(stanga[fd]>dreapta[fd])?stanga[fd]:dreapta[fd];
	maxim[nod]=(maxim[nod]>maxim[fd])?maxim[nod]:maxim[fd];
      }
      if(stare[fd]==ocupat)
      { stare[nod]=ocupat;maxim[nod]=0;}
    }
}