Cod sursa(job #2088967)

Utilizator ReeeBontea Mihai Reee Data 16 decembrie 2017 09:49:16
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <fstream>

using namespace std;

ifstream fin("arbint.in");
ofstream fout("arbint.out");

int n , m , arb[90000];

int Maxim( int a , int b )
{
    return ( a > b )? a : b;
}

void Creare( int Node , int Low , int High , int Pos , int Val )
{
    if ( Low == High )
        arb[Node] = Val;
    else
    {
        int Mid = ( Low + High ) / 2;
        if ( Pos <= Mid ) Creare( 2 * Node , Low , Mid , Pos , Val );
        else Creare( 2 * Node + 1 , Mid + 1 , High , Pos , Val );
        arb[Node] = Maxim( arb[2 * Node] , arb[2 * Node + 1] );
    }
}

int Querry( int Node , int Low , int High , int qA , int qB )
{
    int Mid , R1 = -1 , R2 = -1;
    if ( qA <= Low && High <= qB )
        return arb[Node];
    Mid = ( Low + High ) / 2;
    if ( qA <= Mid )
        R1 = Querry( 2 * Node , Low , Mid , qA , qB );
    if ( Mid < qB )
        R2 = Querry( 2 * Node + 1 , Mid + 1 , High , qA , qB );
    return Maxim( R1 , R2 );
}

void Read()
{
    int cer , a1 , b1 , aux;
    fin >> n >> m;
    for ( int i = 1 ; i <= n ; ++i )
    {
        fin >> aux;
        Creare( 1 , 1 , n , i , aux );
    }
    for ( int i = 1 ; i <= m ; ++i )
    {
        fin >> cer >> a1 >> b1;
        if ( cer == 1 )
            Creare( 1 , 1 , n , a1 , b1 );
        else fout << Querry( 1 , 1 , n , a1 , b1 ) << '\n';
    }
}

int main()
{
    Read();
    return 0;
}