Cod sursa(job #1215739)

Utilizator xtreme77Patrick Sava xtreme77 Data 2 august 2014 00:20:53
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <fstream>

#define rint register int
#define max(a,b) ((a>b)?(a):(b))

const char IN [ ] = "arbint.in" ;
const char OUT [ ] = "arbint.out" ;
const int MAX = 101414 ;

using namespace std;

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

int v [ 4 * MAX ] , n , val , pos , maxim , start , finish ;
void updt ( int  nod , int st , int dr );
void query ( int nod , int st , int dr );
int main( )
{
    int m ;
    fin >> n >> m ;
    for ( rint i = 1 ; i <= n ; ++ i )
    {
        fin >> val ;
        pos = i ;
        updt ( 1 , 1 , n ) ;
    }
    while ( m -- )
    {
        int x , a , b ;
        fin >> x >> a >> b ;
        if ( ! x )
        {
            maxim = - 14 ;
            start = a ;
            finish = b ;
            query( 1 , 1 , n ) ;
            fout << maxim << '\n' ;
        }
        else
        {
            val = b ;
            pos = a ;
            updt( 1 , 1 , n );
        }
    }
    return 0;
}
void updt ( int  nod , int st , int dr )
{
    if ( st == dr )
    {
        v [ nod ] = val ;
        return ;
    }
    int mij = ( st + dr ) >> 1 ;
    if ( pos <= mij )
        updt ( ( nod << 1 ) , st , mij ) ;
    else updt ( ( nod << 1 ) + 1 , mij + 1 , dr ) ;
    v [ nod ] = max ( v [ ( nod << 1 ) ], v [ ( nod << 1 ) + 1 ] ) ;
}
void query ( int nod , int st , int dr )
{
    if( start <= st and dr <= finish )
    {
        maxim = max ( maxim , v [ nod ] );
        return ;
    }
    int mij = ( st + dr ) >> 1 ;
    if ( start <= mij )
        query ( ( nod << 1 ) , st , mij );
    if ( mij < finish )
        query ( ( nod << 1 ) + 1, mij + 1 , dr ) ;
}