Cod sursa(job #388446)

Utilizator alexandru92alexandru alexandru92 Data 30 ianuarie 2010 10:59:40
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
/* 
 * File:   main.cpp
 * Author: virtualdemon
 *
 * Created on January 29, 2010, 10:02 AM
 */
#include <fstream>

/*
 *
 */
using namespace std;
int *v;
inline int max( int x, int y )
{
    return x^( (x^y) & -(x<y) );
}
inline void Update( int vertex, int left, int right, int p, int x )
{
    if( left == right )
    {
        v[vertex]=x;
        return;
    }
    int middle=left+( right-left )/2;
    if( p <= middle )
        Update( 2*vertex, left, middle, p, x );
    else Update( 2*vertex+1, middle+1, right, p, x );
    v[vertex]=max( v[2*vertex], v[2*vertex+1] );
}
inline int Query( int vertex, int left, int right, int a, int b )
{
   if(  a <= left && right <= b )
       return v[vertex];
   int max1=-1, max2=-1, middle=left+( right-left )/2;
   if(  a <= middle )
       max1=Query( 2*vertex, left, middle, a, b );
   if(  b > middle )
       max2=Query( 2*vertex+1, middle+1, right, a, b );
   return max( max1, max2 );
}
int main()
{int N, m, i, x, y, z;
    ifstream in("arbint.in");
    in>>N>>m;
    v=new int[4*N+1];
    for( i=1; i <= N; ++i )
    {
        in>>x;
        Update( 1, 1, N, i, x );
    }
    ofstream out("arbint.out");
    for( i=1; i <= m; ++i )
    {
        in>>x>>y>>z;
        if( 0 == x )
            out<<Query( 1, 1, N, y, z )<<'\n';
        else Update( 1, 1, N, y, z );
    }
    return 0;
}