Cod sursa(job #369626)

Utilizator TabaraTabara Mihai Tabara Data 28 noiembrie 2009 23:54:43
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <fstream>
using namespace std;

#define in "arbint.in"
#define out "arbint.out"
#define maxim(a,b) ((a)>(b)?(a):(b))

const int INF = (1<<30);
const int NMAX = 200005;
int A[NMAX], N, M, POS, VALUE, VAL_MAX;

void Update( int nod, int left, int right )
{
     if ( left == right )
     {
        A[nod] = VALUE;
        return;
     }
     
     int div = (left+((right-left)>>1));
     if ( POS <= div ) Update ( 2*nod, left, div );
     else              Update ( 2*nod+1, div+1,right );
     
     A[nod] = maxim ( A[2*nod], A[2*nod+1] );
}

void Query( int nod, int left, int right, int START, int FINAL )
{
     if ( START <= left && right <= FINAL )
     {
          VAL_MAX = maxim( VAL_MAX, A[nod] );
          return;
     }
     int div = (left + ((right-left)>>1));
     if ( START <= div ) Query ( 2*nod, left, div, START, FINAL );
     if ( FINAL > div )  Query ( 2*nod+1, div+1, right, START, FINAL );
}

int main(void)
{
    freOPen ( in, "r", stdin );
    freOPen ( out, "w", stdout );
    
    scanf ( "%d%d", &N, &M );
    
    int i, OP, START, FINAL;
    for ( i = 1; i <= N; ++i ) 
    {
        POS = i;
        scanf ( "%d", &VALUE );    
        Update( 1, 1, N );
    }
    
    for ( ; M; --M ) 
    {
        scanf ( "%d%d%d", &OP, &POS, &VALUE );
        if ( OP ) Update ( 1, 1, N );
        else {
            START = POS, FINAL = VALUE, VAL_MAX = -INF;
            Query(1,1,N,START,FINAL);
            printf ( "%d\n", VAL_MAX );
        }
    }
    
    return 0;
}