Cod sursa(job #446396)

Utilizator alexandru92alexandru alexandru92 Data 25 aprilie 2010 19:29:44
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
/* 
 * File:   main.cpp
 * Author: virtualdemon
 *
 * Created on April 25, 2010, 7:15 PM
 */
#include <cstdlib>
#include <fstream>
#define Nmax 400011

/*
 * 
 */
using namespace std;
int Aint[Nmax];
inline void UpDate( int vertex, int left, int right, int P, int x  )
{
    if( left == right )
    {
        Aint[vertex]=x;
        return;
    }
    int middle=left+(right-left)/2;
    if( P <= middle )
        UpDate( 2*vertex, left, middle, P, x  );
    else UpDate( 2*vertex+1, middle+1, right, P, x );
    Aint[vertex]=max( Aint[2*vertex], Aint[2*vertex+1] );
}
inline int Query( int vertex, int left, int right, int a, int b )
{
    if( a <= left && right <= b )
        return Aint[vertex];
    int middle=left+(right-left)/2, x=-1;
    if( a <= middle )
        x=Query( 2*vertex, left, middle, a, b );
    if( b > middle )
        x=max( x, Query( 2*vertex+1, middle+1, right, a, b ) );
    return x;
}
int main(int argc, char** argv)
{
    int N, M, x, i;
    ifstream in( "arbint.in" );
    ofstream out( "arbint.out" );
    for( in>>N>>M, i=1; i <= N; ++i )
    {
        in>>x;
        UpDate( 1, 1, N, i, x );
    }
    for( ; M; --M )
    {
        in>>i;
        if( !i )
        {
            in>>i>>x;
            out<<Query( 1, 1, N, i, x )<<'\n';
            continue;
        }
        in>>i>>x;
        UpDate( 1, 1, N, i, x );
    }
    return (EXIT_SUCCESS);
}