Cod sursa(job #1220672)

Utilizator xtreme77Patrick Sava xtreme77 Data 18 august 2014 03:14:01
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.27 kb
#include <fstream>

#define INTRA -1
#define IESE 1

const char IN [ ] = "hotel.in" ;
const char OUT [ ] = "hotel.out" ;
const int MAX = 100014 ;

using namespace std;

ifstream fin ( IN ) ;
ofstream fout ( OUT ) ;

struct hotel {
    int left , right , val ;
    void sett ( int q )
    {
        left = right = val = q ;
    }

};

hotel q [ 7 * MAX ] ;
int Cond [ 7 * MAX ] ;

inline void lazy ( int poz , int st , int dr )
{
    if ( Cond [ poz ] )
    {
        if ( Cond [ poz ] == INTRA )
            q [ poz ].sett ( 0 ) ;
        if ( Cond [ poz ] == IESE )
            q [ poz ].sett ( 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 and dr <= y )
    {
        Cond [ poz ] = val ;
        lazy ( poz , st , dr ) ;
        return ;
    }
    lazy ( poz , st , dr ) ;

    int mij = ( st + dr ) >> 1 ;

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

    lazy ( poz << 1 , st , mij ) ;
    lazy ( poz << 1 | 1, mij + 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  == mij - st + 1 ) ? ( q [ poz << 1 ].val + q [ poz << 1 | 1 ].left ) : ( q [ poz << 1 ].left ) ;
    q [ poz ].right = ( q [ poz << 1 | 1 ].val == dr - mij ) ? ( q [ poz << 1 | 1 ].val + q [ poz << 1 ].right ) : ( q [ poz << 1 | 1 ].right ) ;
}

int main( )
{
    int n , p , hasher = 0 ;
    fin >> n >> p ;
    Cond [ 1 ] = IESE ;
    lazy ( 1 , 1 , n ) ;
    for ( ; p ; -- p )
    {
        int z ;
        fin >> z ;
        if ( z == 1 ){

            int x , y ;
            fin >> x >> y ;

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

        }   else if ( z == 2 ) {

            int x , y ;
            fin >> x >> y ;

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

        }       else if ( z == 3 ){

            fout << q [ 1 ].val << '\n' ;
        }
    }
    return hasher ;
}