Cod sursa(job #1343450)

Utilizator gedicaAlpaca Gedit gedica Data 15 februarie 2015 14:55:15
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <fstream>

using namespace std;

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

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

int st[ NMAX+1 ];

int query( int nod, int nodl, int nodr, int x, int y )
{
    if( y < nodl || x> nodr ) return -INF;
    if( x<=nodl && y>=nodr ) return st[nod];

    int mid= ( nodl + nodr ) / 2;

    int a= query( nod * 2, nodl, mid, x, y );
    int b= query( nod * 2 + 1, mid+1, nodr, x, y );

    return max( a, b );
}

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-1; 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
        {
            out << query( 1, 1, N2, y, z ) << '\n';
        }


    }
    return 0;
}