Cod sursa(job #331913)

Utilizator mihai_floreaFlorea Mihai Alexandru mihai_florea Data 15 iulie 2009 19:23:46
Problema Hotel Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <stdio.h>
int N,M,A[262144],B[262144],C[262144];
void update(int n,int l,int r,int a,int b,int t)
{
     if (a<=l && r<=b)
        if (t==1) A[n]=B[n]=C[n]=0;
        else A[n]=B[n]=C[n]=r-l+1;
     else
     {
        int m=(l+r)/2;
        
        //dc update-urile anterioare s-au oprit aici
        if (A[n]==r-l+1)
        {
           A[2*n]=B[2*n]=C[2*n]=m-l+1;
           A[2*n+1]=B[2*n+1]=C[2*n+1]=r-m;
        }
        if (A[n]==0)
        {
           A[2*n]=B[2*n]=C[2*n]=0;
           A[2*n+1]=B[2*n+1]=C[2*n+1]=0;
        }
        
        if (a<=m) update(2*n,l,m,a,b,t);
        if (b>m) update (2*n+1,m+1,r,a,b,t);
        
        if (B[2*n]==m-l+1) B[n]=m-l+1+B[2*n+1];
        else B[n]=B[2*n];
        if (C[2*n+1]==r-m) C[n]=r-m+C[2*n];
        else C[n]=C[2*n+1];
        A[n]= A[2*n] > A[2*n+1] ? A[2*n] : A[2*n+1];
        if (A[n]<B[2*n+1]+C[2*n]) A[n]=B[2*n+1]+C[2*n];
     }
}  

int main()
{
    freopen("hotel.in","r",stdin);
    freopen("hotel.out","w",stdout);
    scanf("%d %d",&N,&M);
    A[1]=B[1]=C[1]=N;
    while (M--)
    {
          int t,a,b;
          scanf("%d",&t);
          if (t<3) 
          {
            scanf("%d %d",&a,&b);
            update(1,1,N,a,a+b-1,t);
          }
          else
            printf("%d\n",A[1]);
    }
    return 0;
}