Cod sursa(job #2158903)

Utilizator Victor24Vasiesiu Victor Victor24 Data 10 martie 2018 17:03:51
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <fstream>

using namespace std;

ifstream f ("hotel.in");
ofstream g ("hotel.out");
struct
{
    int maxi, stanga, dreapta;

} arb[ 400005 ];

int n, p, i, tip, x, y;

void update ( int nod, int st, int dr, int L, int R, int val )
{
    if ( st > R || dr < L )
    {
        return;
    }

    if ( st >= L && dr <= R  )
    {
        arb[ nod ].maxi = arb[nod].stanga = arb[nod].dreapta = val * ( dr - st + 1 );
        return;
    }

    int mij = (st+dr) / 2;

    if ( arb[nod].maxi == 0 )
    {
        arb[2*nod].maxi = arb[2*nod].stanga = arb[2*nod].dreapta = 0;
        arb[2*nod+1].maxi = arb[2*nod+1].stanga = arb[2*nod+1].dreapta = 0;
    }
    if ( arb[nod].maxi == dr - st + 1 )
    {
        arb[2*nod].maxi = arb[2*nod].stanga = arb[2*nod].dreapta = mij-st + 1;
        arb[2*nod+1].maxi = arb[2*nod+1].stanga = arb[2*nod+1].dreapta = dr - mij;
    }

    update ( 2*nod, st, mij, L , R , val );
    update ( 2*nod+1 , mij + 1, dr, L , R, val  );

    if ( arb[ 2 * nod ].maxi == (mij-st+1) )
    {
        arb[nod].stanga = arb[ 2*nod ].maxi + arb[ 2 * nod + 1 ].stanga;
    }
    else
    {
        arb[nod].stanga = arb[2*nod].stanga;
    }

    if ( arb[ 2 * nod + 1 ].maxi == dr - mij )
    {
        arb[nod].dreapta = arb[ 2*nod+1 ].maxi +arb[2*nod].dreapta;
    }
    else
    {
        arb[nod].dreapta = arb[ 2*nod + 1].dreapta;
    }

    arb[nod].maxi = max(  max ( arb[2*nod].maxi , arb[2*nod+1].maxi ), arb[2*nod].dreapta + arb[2*nod+1].stanga  );

}

int main()
{
    f>>n>>p;



    update( 1 , 1 , n , 1 , n, 1 );

    for ( i = 1; i <= p ; i++ )
    {
        f>>tip;

        if ( tip == 3 )
        {
            g<<arb[1].maxi<<'\n';
            continue;
        }

        f>>x>>y;

        update( 1 , 1 , n , x , x+y-1, tip-1 );

    }

    return 0;
}