Cod sursa(job #1398318)

Utilizator DysKodeTurturica Razvan DysKode Data 24 martie 2015 09:28:28
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>

using namespace std;

#define DIM 100010

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

int Arb[4*DIM],i,j,x,y,q,n,m,val,pos,start,finish,ans;

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

    int middle = ( left + right ) / 2;

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

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

void _Query(int nod, int left, int right)
{
    if( left > finish || right < start )
        return;

    if( left >= start && right <= finish )
    {
        ans = max( ans , Arb[ nod ] );
        return;
    }

    int middle = ( left + right ) / 2;

    _Query( 2 * nod , left , middle );
    _Query( 2 * nod + 1 , middle + 1 , right );

}

int main()
{
    fin>>n>>m;

    for(i=1 ; i<=n ; ++i)
    {
        fin>>x;
        val = x;
        pos = i;
        _Update( 1 , 1 , n );
    }

    for(i=1 ; i<=m ; ++i)
    {
        fin>>q>>x>>y;
        if( q == 1 )
        {
            pos = x;
            val = y;
            _Update( 1 , 1 , n );
        }
        else
        {
            ans = 0;
            start = x;
            finish = y;
            _Query( 1 , 1 , n );
            fout<<ans<<'\n';
        }
    }

return 0;
}