Cod sursa(job #492129)

Utilizator BitOneSAlexandru BitOne Data 13 octombrie 2010 15:56:06
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
/* 
 * File:   main.cpp
 * Author: bitone
 *
 * Created on October 13, 2010, 3:23 PM
 */
#include <fstream>
#include <cstdlib>
#define MAX_N 400011
#define oo 2000000000

using namespace std;

/*
 * 
 */
int A[MAX_N];
inline void Update( int vertex, int left, int right, int& index, int& value )
{
    if( left == right )
    {
        A[vertex]=value;
        return;
    }
    int middle=left+(right-left)/2;
    if( index <= middle )
        Update( 2*vertex, left, middle, index, value );
    else Update( 2*vertex+1, middle+1, right, index, value );
    A[vertex]=max( A[2*vertex], A[2*vertex+1] );
}
inline int Query( int vertex, int left, int right, int& a, int& b )
{
    if( a <= left  && b >= right  )
        return A[vertex];
    int q1=0, q2=0, middle=left+(right-left)/2;
    if( a <= middle )
        q1=Query( 2*vertex, left, middle, a, b );
    if( b > middle )
        q2=Query( 2*vertex+1, middle+1, right, a, b );
    return max( q1, q2 );
}
int main(int argc, char** argv)
{
    int N, M, x, i;
    ifstream in( "arbint.in" );
    in>>N>>M;
    for( i=1; i <= N; ++i )
    {
        in>>x;
        Update( 1, 1, N, i, x );
    }
    ofstream out( "arbint.out" );
    for(; M; --M )
    {
        in>>i;
        if( 0 == i )
        {
            in>>i>>x;
            out<<Query( 1, 1, N, i, x )<<'\n';
        }
        else {
                in>>i>>x;
                Update( 1, 1, N, i, x );
             }
    }
    return EXIT_SUCCESS;
}