Cod sursa(job #434629)

Utilizator alexandru92alexandru alexandru92 Data 6 aprilie 2010 12:39:42
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
/* 
 * File:   main.cpp
 * Author: SpeeDemon
 *
 * Created on April 6, 2010, 11:39 AM
 */
#include <cstdlib>
#include <fstream>
#define Nmax 400

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