Cod sursa(job #478926)

Utilizator BitOneSAlexandru BitOne Data 21 august 2010 10:25:51
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
/* 
 * File:   main.cpp
 * Author: bitone
 *
 * Created on August 20, 2010, 2:05 PM
 */
#include <fstream>
#include <cstdlib>
#define MAX_N 4*100000+11

using namespace std;

/*
 * 
 */
typedef signed int sint;
sint A[MAX_N];
inline void UpDate( sint i, sint left, sint right, sint x, sint xpoz )
{
    if( left == right )
    {
        A[i]=x;
        return;
    }
    sint middle=left+(right-left)/2;
    if( xpoz <= middle )
        UpDate( 2*i, left, middle, x, xpoz );
    else UpDate( 2*i+1, middle+1, right, x, xpoz );
    A[i]=( A[2*i] >= A[2*i+1] ? A[2*i] : A[2*i+1] );    
}
inline sint Query( sint i, sint left, sint right, sint a, sint b )
{
    if( left >= a && right <= b )
        return A[i];
    sint q1=0, q2=0, middle=left+(right-left)/2;
    if( a <= middle )
        q1=Query( 2*i, left, middle, a, b );
    if( b > middle )
        q2=Query( 2*i+1, middle+1, right, a, b );
    return ( q1 >= q2 ? q1 : q2 );
}
int main( void )
{
    sint N, M, i, x;
    ifstream in( "arbint.in" );
    in>>N>>M;
    for( i=1; i <= N; ++i )
    {
        in>>x;
        UpDate( 1, 1, N, x, i );
    }
    ofstream out( "arbint.out" );
    for( ; M; --M )
    {
        in>>i;
        if( i )
        {
            in>>i>>x;
            UpDate( 1, 1, N, x, i );
        }
        else {
                in>>i>>x;
                out<<Query( 1, 1, N, i, x )<<'\n';
              }
    }
    return EXIT_SUCCESS;
}