Cod sursa(job #335360)

Utilizator klamathixMihai Calancea klamathix Data 29 iulie 2009 18:33:13
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include<cstdio>
#define MAXN ( 1 << 18 ) 

int i , j , Pos , maxs  , Value , a, b, N , M , X , y , Start , End , type ;

int Tree[MAXN];

inline int Max ( int X , int Y ) {
       if ( X > Y ) return X;
       return Y;
}

void Update ( int nod , int left , int right ) { 
     int mid = ( left + right ) >> 1;
     
     if ( left == right ) {
          Tree[nod] = Value ;
          return ;
          }
     
     if ( Pos <= mid ) Update ( 2 * nod , left , mid  );
     else Update ( 2 * nod + 1 , mid + 1 , right ) ;
     
     Tree[nod] = Max ( Tree[2 * nod] , Tree[2 * nod + 1] );
}

void Query ( int nod , int left , int right ) {
     
     int mid = ( left + right ) >> 1;
     
     if( Start <= left && End >= right ) {
         if ( Tree[nod] > maxs ) maxs = Tree [nod] ;
         return;
         }
     
     if ( Start <= mid ) Query ( 2 * nod , left , mid ) ;
     if ( End > mid ) Query ( 2 * nod + 1 , mid + 1 , right );

}
     
     
         
int main () 
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    
    scanf("%d %d" ,&N ,&M);
    
    for( i = 1 ; i <= N ; ++i ) { 
         scanf("%d" , &X );
         Pos = i , Value = X;
         Update ( 1 , 1 , N );
         }         
    
    for( ; M -- ; ) { 
         scanf("%d %d %d " , &type , &a , &b ) ;
         if ( type == 1 ) {
              Pos = a , Value = b;
              Update ( 1 , 1 , N ) ;
              }
         else { 
              maxs = -1;
              Start = a , End = b;
              Query ( 1 , 1 , N ) ;
              printf("%d\n",maxs);
              }
         }

return 0;
}