Cod sursa(job #1408867)

Utilizator LolkekzorChiorean Tudor Lolkekzor Data 30 martie 2015 11:59:16
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");

int n, m, i, a, b, q;
int Arb[ 2 * 100000 + 50 ], limit_s, limit_d, pos, val;

void _Update( int nod , int left , int right )
{
    if ( left == right )
    {
        Arb[ nod ] = val;
        return;
    }

    int middle = ( left + right ) / 2;

    if ( pos <= middle )
        _Update( 2 * nod , left , middle );
    else
        _Update( 2 * nod + 1 , middle + 1 , right );

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

int _Maxim( int nod , int left , int right )
{
    if ( left > limit_d || right < limit_s )
        return -1;

    int middle = ( left + right ) / 2;
    if ( left >= limit_s && right <= limit_d )
        return Arb[ nod ];

    return max( _Maxim( 2 * nod , left , middle ),_Maxim( 2 * nod + 1 , middle + 1 , right ) );
}

int main()
{
    fin>>n>>m;
    for ( i=1 ; i<=n ; i++ )
    {
        pos = i;
        fin>>val;
        _Update( 1 , 1 , n );
    }
    for ( i=1 ; i<=m ; i++ )
    {
        fin>>q>>a>>b;
        if (q==0)
        {
            limit_s=a;
            limit_d=b;
            fout<<_Maxim( 1 , 1 , n )<<'\n';
        }
        else
        {
            pos=a;
            val=b;
            _Update( 1 , 1 , n );
        }
    }

return 0;
}