Cod sursa(job #1284379)

Utilizator ConstantinPetroviciPetrovici Constantin ConstantinPetrovici Data 6 decembrie 2014 14:42:15
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <iostream>
#include <cstdio>

using namespace std;

int n , m , v[100007] , poz , aint[100007] , sol , a , b ;
void create ( int nod , int st , int dr )
{
    if ( st == dr )
    {
        aint[nod]=v[st] ;
        return;
    }
    int mij = (st+dr)/2 ;
    create ( nod*2 , st , mij ) ;
    create ( nod*2+1 , mij+1 , dr ) ;
    aint[nod]=max(aint[nod*2] , aint[nod*2+1] ) ;
}
void update ( int nod , int st , int dr )
{
    if ( st == dr )
    {
        aint[nod]=b;
        return;
    }
    int mij = (st+dr)/2 ;
    if ( poz <= mij )update( nod*2 , st , mij ) ;
    else
        update ( nod*2+1 , mij+1 ,dr ) ;
    aint[nod]=max(aint[nod*2] , aint[nod*2+1] ) ;
}
void query (int nod , int st , int dr )
{
    if ( a <= st and dr <=b )
    {
        sol = max(sol , aint[nod] ) ;
        return;
    }
    int mij = ( st + dr)/2;
    if ( a <= mij )
            query( nod*2 , st , mij ) ;
    if ( b > mij )
            query( nod*2+1 , mij+1 , dr ) ;
}
int main()
{
    freopen ("arbint.in" , "r" , stdin ) ;
    freopen ("arbint.out" , "w" , stdout ) ;
    scanf ("%d %d" , &n , &m ) ;
    for ( int i = 1 ; i <= n ; ++i )
        scanf ("%d" , &v[i] ) ;
        create ( 1 , 1 , n ) ;
    for ( int i = 1 ; i <= m ; ++i )
    {
        int x , y , z ;
        scanf ("%d%d%d" , &x , &y , &z ) ;
        if ( x == 0 )
        {
            sol=0;
            a=y;
            b=z;
            query ( 1 , 1 , n );
            printf ("%d\n" , sol );
        }
        if ( x == 1 )
        {
            poz = y ;
            b = z ;
            update ( 1 , 1 , n ) ;
        }
    }
    return 0;
}