Cod sursa(job #1246394)

Utilizator AndreiBarbutaAndrei Barbuta AndreiBarbuta Data 21 octombrie 2014 00:17:15
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <fstream>

#define IN "arbint.in"
#define OUT "arbint.out"

const int MAX = 100014 ;

using namespace std;

ifstream fin ( IN ) ;
ofstream fout ( OUT ) ;

int v [ MAX ] , arb [ 3 * MAX ] , l , r ;

void update ( int nod , int st , int dr , int poz ) ;
int query ( int nod , int st , int dr ) ;

int main()
{
    int x , n , m ;
    fin >> n >> m ;
    for ( register int i = 1 ; i <= n ; ++ i )
        fin >> v [ i ] ;
    update ( 1 , 1 , n , 0 ) ;
    for ( ; m ; -- m ){
        fin >> x >> l >> r ;
        if ( x ){
            v [ l ] = r ;
            update ( 1 , 1 , n , l ) ;
        }
        else
            fout << query ( 1 , 1 , n ) << '\n' ;
    }
    return 0 ;
}

void update ( int nod , int st , int dr , int poz ) {
    if ( dr == st )
        arb [ nod ] = v [ st ] ;
    else{
        int mij = ( st + dr ) / 2 ;
        if ( poz <= mij or !poz )
            update ( 2 * nod , st , mij , poz ) ;
        if ( poz > mij or !poz )
            update ( 2 * nod + 1 , mij + 1 , dr , poz ) ;
        arb [ nod ] = ( arb [ 2 * nod ] > arb [ 2 * nod + 1 ] ) ? arb [ 2 * nod ] : arb [ 2 * nod + 1 ] ;
    }
}

int query ( int nod , int st , int dr ) {
    if ( l <= st and dr <= r )
        return arb [ nod ] ;
    else{
        int mij = ( st + dr ) / 2 ;
        int maxl = 0 ;
        int maxr = 0 ;
        if ( l < mij )
            maxl = query ( 2 * nod , st , mij ) ;
        if ( r >= mij )
            maxr = query ( 2 * nod + 1 , mij + 1 , dr ) ;
        return ( maxl > maxr ) ? maxl : maxr ;
    }
}