Cod sursa(job #2490297)

Utilizator Andrei-27Arhire Andrei Andrei-27 Data 10 noiembrie 2019 01:02:39
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <bits/stdc++.h>
using namespace std ;
const int NR = 100002 ;
ifstream in ("arbint.in") ;
ofstream out ("arbint.out") ;
vector < int > Tree ( NR << 2 , 0 ) ;
void element_update ( int nod , int st , int dr , int pos , int val )
{
    if ( st == dr )   { Tree [ nod ] = val ;    return ; }

    int mid = ( st + dr ) >> 1 ;
    if ( pos <= mid )   element_update( nod << 1 , st , mid , pos , val ) ;
    else                element_update( nod << 1 | 1 , mid + 1 , dr , pos , val ) ;
    Tree [ nod ] = max ( Tree [ nod << 1 ] , Tree [ nod << 1 | 1] ) ;
}
int range_query ( int nod , int st , int dr , int a , int b )
{

    if ( a <= st && dr <= b )   return Tree [ nod ] ;
    int mid = (st+dr) >> 1 , leftmax = 0 , rightmax = 0 ;
    if ( mid >= a )    leftmax = range_query( nod << 1 , st , mid , a , b ) ;
    if ( mid < b )      rightmax = range_query( nod << 1 | 1 , mid + 1 , dr , a , b ) ;
    return max ( leftmax , rightmax ) ;
}
int n , m , value , pos , lft , rght , i , type ;
int main ()
{
   in >> n >> m ;
   for ( i = 1 ; i <= n ; ++ i )
   {
       in >> value ;
       element_update( 1 , 1 , n , i , value ) ;
   }
    while ( m -- )
    {
        in >> type ;
        if ( type == 0 )
        {
            in >> lft >> rght ;
            out << range_query( 1 , 1 , n , lft , rght ) << '\n' ;
        }
        else
        {
            in >> pos >> value ;
            element_update( 1 , 1 , n , pos , value ) ;
        }
    }
}