Cod sursa(job #459875)

Utilizator BitOneSAlexandru BitOne Data 31 mai 2010 14:46:50
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <cstdlib>
#include <fstream>
#define Nmax 400111

/*
 *
 */
using namespace std;
int Aint[Nmax];
inline void UpDate( int vertex, int left, int right, int x, int xIdx )
{
    if( left == right )
        Aint[vertex]=x;
    else {
            int middle=left+(right-left)/2;
            if( xIdx <= middle )
                UpDate( 2*vertex, left, middle, x, xIdx  );
            else UpDate( 2*vertex+1, middle+1 , right, x, xIdx );
            Aint[vertex]=max( Aint[2*vertex], Aint[2*vertex+1] );
         }
}
inline int Query( int vertex, int left, int right, int a, int b ) // [ left, right ] intervalul curent, [ a, b ] cel pe care se face query
{
    if( a <= left && right <= b )
        return Aint[vertex];
    int middle=left+(right-left)/2, m=0;
    if( a <= middle )
        m=max( m, Query( 2*vertex, left, middle, a, b ) );
    if( b > middle )
        m=max( m, Query( 2*vertex+1, middle+1, right, a, b ) );
    return m;
}
int main( void )
{
    int N, M, i, a, b;
    ifstream in( "arbint.in" );
    in>>N>>M;
    for( i=1; i <= N; ++i )
    {
        in>>a;
        UpDate( 1, 1, N, a, i );
    }
    ofstream out( "arbint.out" );
    for( ; M; --M )
    {
        in>>i>>a>>b;
        switch( i )
        {
            case 0 : out<<Query( 1, 1, N, a, b )<<'\n'; break;
            case 1 : UpDate( 1, 1, N, b, a );
        }
    }
    return EXIT_SUCCESS;
}