Cod sursa(job #1259102)

Utilizator gedicaAlpaca Gedit gedica Data 9 noiembrie 2014 18:25:39
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <fstream>
#include <algorithm>
using namespace std;

const int NMAX = 100000;

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

int N, M, x, y, k, ans, upoz;
int A[4*NMAX+1];

void update( int st, int dr, int poz, int x )
{
    int mid;
    if ( st==dr )
    {
        A[ poz ] = x;
        return ;
    }
    mid = ( st + dr ) / 2;
    if ( mid < upoz )
    {
        update( mid + 1, dr, 2 * poz + 1, x );
    }
    else
    {
        update( st, mid, 2 * poz, x );
    }
    A[ poz ] = max( A[ 2 * poz ], A[ 2 * poz + 1 ] );
}

void query( int stp, int drp, int st, int dr, int poz )
{
    if ( stp <= st && dr <= drp )
    {
        ans = max( ans, A[ poz ] );
        return ;
    }
    int mid= ( st+dr ) / 2;
    if ( mid >= stp )
    {
        query( stp, drp, st, mid, 2 * poz );
    }
    if ( mid+1<= drp )
    {
        query( stp, drp, mid + 1, dr, 2 * poz + 1 );
    }
}

int main(  )
{
    in >> N >> M;
    for( int i=1; i<=N; ++i )
    {
        in >> x;
        upoz = i;
        update( 1, N, 1, x );
    }
    for( int i = 0; i < M; ++i )
    {
        in >> k >> x >> y;
        if ( k==1 )
        {
            upoz=x;
            update( 1, N, 1, y );
        }
        else
        {
            ans= -1 << 30;
            query( x, y, 1, N, 1 );
            out << ans << '\n';
        }
    }
    return 0;
}