Cod sursa(job #1504928)

Utilizator gedicaAlpaca Gedit gedica Data 18 octombrie 2015 16:11:16
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <fstream>

using namespace std;

const int NMAX= 100000, N2MAX= 131072, INF= (1 << 30);

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

int arb[N2MAX*2];

int calc_N2( int N )
{
    int x= 1;
    while( x<N )
    {
        x*=2;
    }
    return x;
}

int query( int nod, int lq, int rq, int ln, int rn )
{
    int ans1, ans2;

    if( ln >= lq && rn <= rq )
    {
        return arb[nod];
    }
    if( ln > rq || rn < lq )
    {
        return -INF;
    }
    ans1= query( nod*2, lq, rq, ln, (rn+ln)/2 );
    ans2= query( nod*2+1, lq, rq, (rn+ln)/2+1, rn );
    return max( ans1, ans2 );
}

int main(  )
{
    int N, M;
    in >> N >> M;
    int N2= calc_N2(N);
    for( int i= N2; i<=N2+N-1; ++i )
    {
        in >> arb[i];
    }
    for( int i= N2+N; i<=N2*2-1; ++i )
    {
        arb[i]= -INF;
    }

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

    for( int q= 1; q<=M; ++q )
    {
        int a, b, c;
        in >> a >> b >> c;
        if( a==1 )
        {
            int aux= (N2-1+b)/2;
            arb[N2-1+b]= c;
            while(aux>=1)
            {
                arb[aux]= max( arb[aux*2], arb[aux*2+1] );
                aux/=2;
            }
        }
        else
        {
            out << query( 1, b, c, 1, N2 ) << '\n';
        }
    }

    return 0;
}