Cod sursa(job #1149880)

Utilizator PatrikStepan Patrik Patrik Data 22 martie 2014 13:03:36
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
    #include<cstdio>
    #include<iostream>
    using namespace std;
    #define NMAX 100001
    int N , M  , S[NMAX*4] , L[NMAX*4] , R[NMAX*4];

     void update(int n ,int l , int r , int a , int b , int val);

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

    void update(int n , int l , int r , int a , int b, int val)
    {
        if(a <= l && b >= r)
        {
            S[n] = L[n] = R[n] = (r-l+1)*val;
            return;
        }
        int m = (l+r)/2;
        if(S[n] == 0)
        {
            S[2*n] = L[2*n] = R[2*n] = 0;
            S[2*n+1] = L[2*n+1] = R[2*n+1] = 0;
        }
        if(S[n] == r-l+1)
        {
            S[2*n] = L[2*n] = R[2*n] = (m-l+1);
            S[2*n+1] = L[2*n+1] = R[2*n+1] = r-m;
        }
        if(a <= m)update(2*n,l,m,a,b,val);
        if(b > m)update(2*n+1,m+1,r,a,b,val);
        L[n] = L[2*n];
        if(L[2*n] == m-l+1)L[n] +=  L[2*n+1];
        R[n] = R[2*n+1];
        if(R[2*n+1] == r-m)R[n] += R[2*n];
        S[n] = max(S[2*n+1] , S[2*n]);
        S[n] = max(S[n] , R[2*n] + L[2*n+1]);
    }