Cod sursa(job #2000657)

Utilizator DysKodeTurturica Razvan DysKode Data 14 iulie 2017 12:41:05
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <fstream>

using namespace std;

int i,j,n,m,x,y,a,b,q,ans,arb[4*100010];

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

void upd( int nod, int left, int right, int poz, int val )
{
    int middle = ( left + right ) / 2;

    if( left == right )
    {
        arb[ nod ] = val;
        return;
    }

    if( poz <= middle )
        upd( 2 * nod , left , middle , poz , val );
    else
        upd( 2 * nod + 1 , middle + 1 , right , poz , val );

    arb[ nod ] = max( arb[ 2 * nod ] , arb[ 2 * nod + 1 ] );
}

void query( int nod, int left, int right, int L, int R )
{
    int middle = ( left + right ) / 2;

    if( L <= left && right <= R )
    {
        ans = max( ans , arb[ nod ] );
        return;
    }

    if( left > R || right < L )
    {
        return;
    }

    query( 2 * nod , left , middle , L , R );
    query( 2 * nod + 1 , middle + 1 , right , L , R );
}

int main()
{
    fin>>n>>m;
    for( i = 1 ; i <= n ; i++ )
    {
        fin>>x;
        upd( 1 , 1 , n , i , x );
    }

    for( i = 1 ; i <= m ; i++ )
    {
        fin>>q>>a>>b;
        if( q == 1 )
        {
            upd( 1 , 1 , n , a , b );
        }
        else
        {
            ans = 0;
            query( 1 , 1 , n , a , b );
            fout<<ans<<'\n';
        }
    }

return 0;
}