Cod sursa(job #1349346)

Utilizator gedicaAlpaca Gedit gedica Data 20 februarie 2015 09:55:16
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.34 kb
#include <fstream>
#include <algorithm>

const int INTRA= -1, IESE= 1, NMAX= 100000;

using namespace std;

ifstream in( "hotel.in" );
ofstream out( "hotel.out" );


struct hotel
{

    int left, right, val;

    void init( int q )
    {
        left = right = val = q;
    }

} q[ 7 * NMAX+ 1 ];

int Cond[ 7 * NMAX + 1 ];

void LAZY( int poz, int st, int dr )
{
    if ( Cond [ poz ] )
    {
        if ( Cond [ poz ] == INTRA )
        {
            q [ poz ].init( 0 ) ;
        }
        if ( Cond [ poz ] == IESE )
        {
            q [ poz ].init( dr - st + 1 ) ;
        }
        if ( st != dr )
        {
            Cond [ poz << 1 ]= Cond [ poz << 1 | 1 ] = Cond [ poz ] ;
        }

        Cond [ poz ] = 0 ;
    }
}

void UPDATE ( int poz , int st ,int dr , int x , int y , int val )
{
    if ( x <= st && dr <= y )
    {
        Cond [ poz ] = val ;
        LAZY( poz , st , dr ) ;
        return ;
    }

    LAZY( poz , st , dr ) ;

    int mid= ( st + dr ) / 2;

    if ( x <= mid )
    {
        UPDATE ( poz << 1 , st , mid , x , y ,val );
    }
    if ( y > mid )
    {
        UPDATE ( poz << 1 | 1 , mid + 1 , dr , x , y , val );
    }

    LAZY( poz << 1 , st , mid ) ;
    LAZY( poz << 1 | 1, mid + 1 , dr ) ;

    q [ poz ].val = max ( max ( q [ poz << 1 ].val , q [ poz << 1 | 1 ].val ) , q [ poz << 1 ].right + q [ poz << 1 | 1 ].left );

    q [ poz ].left = ( q [ poz << 1 ].val  == mid - st + 1 ) ? ( q [ poz << 1 ].val + q [ poz << 1 | 1 ].left ) : ( q [ poz << 1 ].left );

    q [ poz ].right = ( q [ poz << 1 | 1 ].val == dr - mid ) ? ( q [ poz << 1 | 1 ].val + q [ poz << 1 ].right ) : ( q [ poz << 1 | 1 ].right );

}

int main( )
{
    int N , Q;
    in >> N >> Q;

    Cond[1]= IESE;

    LAZY( 1 , 1 , N );

    for ( int t= 1; t<=Q; ++t )
    {

        int f;
        in >> f;
        if ( f == 1 )
        {

            int x , y ;
            in >> x >> y ;

            UPDATE ( 1 , 1 , N , x , x + y - 1 , INTRA ) ;

        }
        else if ( f == 2 )
        {

            int x , y ;
            in >> x >> y ;

            UPDATE ( 1 , 1 , N , x , x + y - 1 , IESE ) ;

        }
        else if ( f == 3 )
        {
            int aux= 1;
            out << q[aux].val << '\n' ;
        }

    }

    return 0;
}