Cod sursa(job #582051)

Utilizator BitOneSAlexandru BitOne Data 14 aprilie 2011 20:29:40
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <fstream>
#include <cstdlib>
#define N_MAX 1<<18

using namespace std;
int Aint[N_MAX];
inline int _max( int x, int y ) { return x >= y ? x : y; }
inline void Update( int vertex, int left, int right, int& xIndex, int& xValue )
{
    if( left == right )
    {
        Aint[vertex]=xValue;
        return ;
    }
    int middle=(left+right)>>1;
    if( xIndex <= middle )
        Update( vertex<<1, left, middle, xIndex, xValue );
    else Update( (vertex<<1)|1, middle+1, right, xIndex, xValue );
    Aint[vertex]=_max( Aint[vertex<<1], Aint[(vertex<<1)|1] );
}
inline int Query( int vertex, int left, int right, int& Left, int& Right )
{
    if( left >= Left && right <= Right )
        return Aint[vertex];
    int middle=(left+right)>>1, m1=0, m2=0;
    if( Left <= middle )
        m1=Query( vertex<<1, left, middle, Left, Right );
    if( Right > middle )
        m2=Query( (vertex<<1)|1, middle+1, right, Left, Right );
    return _max( m1, m2 );
}
int main( void )
{
    int N, M, op, i, j;
    ifstream in( "arbint.in" );
    in>>N>>M;
    for( i=1; i <= N; ++i )
    {
        in>>j;
        Update( 1, 1, N, i, j );
    }
    ofstream out( "arbint.out" );
    for( ; M; --M )
    {
        in>>op>>i>>j;
        switch(op)
        {
            case 0 : out<<Query( 1, 1, N, i, j )<<'\n'; break;
            case 1 : Update( 1, 1, N, i, j ); break;
        }
    }
    return EXIT_SUCCESS;
}