Cod sursa(job #1343415)

Utilizator gedicaAlpaca Gedit gedica Data 15 februarie 2015 14:27:29
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <fstream>
#include <algorithm>

using namespace std;

const int NMAX = 128 * 1024 , INF= ( 1 << 30 );

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

int st[ NMAX+1 ], ans;

void querry( int nodl, int nodr, int x, int y, int poz )
{
    if ( nodl <= x && y <= nodr )
    {
        ans = max( ans, st[ poz ] );
        return ;
    }

    int mid= ( x + y ) / 2;

    if ( mid >= nodl )
    {
        querry( nodl, nodr, x, mid, 2 * poz );
    }
    if ( mid + 1 <= nodr )
    {
        querry( nodl, nodr, mid + 1, y, 2 * poz + 1 );
    }
}

int main(  )
{
    int N, T, N2;
    in >> N >> T;

    for( N2= 1; N2 < N; N2 *=2 ) {}

    for( int i= 1; i<=N; ++i )
    {
        in >> st[ N2-1+i ];
    }

    for( int i= N+1; i<=N2; ++i )
    {
        st[ N2-1+i ]= -INF;
    }

    for( int i= N2; i>=1; --i )
    {
        st[ i ]= max(  st[ i*2 ] , st[ i*2+1 ] );
    }

    int x, y, z;

    for( int t= 1; t<=T; ++t )
    {
        in >> x >> y >> z;

        if( x==1 )
        {
            st[ N2-1+y ]= z;

            for( int i= ( N2-1+y )/2; i>=1; i/=2 )
            {
                st[ i ]= max( st[ i*2 ] , st[ i*2+1 ] );
            }
        }
        else
        {
            ans= -INF;

            querry( y, z, 1, N, 1 );

            out << ans << '\n';
        }

    }
    return 0;
}