Cod sursa(job #145271)

Utilizator floringh06Florin Ghesu floringh06 Data 28 februarie 2008 17:38:05
Problema Arbori de intervale Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.95 kb
#include <cstdio>   
#include <fstream>   
  
using namespace std;   
  
#define MAX_N 100005   
#define INF 0x3f3f3f3   
  
//int a[4*MAX_N + 70];    
int arb[4*MAX_N + 70];   
int N,M,i,A,B;   
int ANSWER;   
  
int MAX (int a, int b)   
{   
    if (a<b) return b; else return a;   
}   
/*  
void buildtree (int ind, int li, int lf)   
{   
  int mj;   
  if (li==lf) arb[ind]=a[li];   
  else   
   {   
      mj=(li+lf)>>1;   
      buildtree(ind << 1,li,mj);   
      buildtree((ind << 1)|1,mj+1,lf);   
      arb[ind]=MAX(arb[ind << 1],arb[(ind << 1)|1]);   
   }   
}   
*/  
int query (int ind, int li, int lf, int A, int B)   
{   
   int mj;   
   if (li>=A && lf<=B) return arb[ind];   
   if(lf<A || li>B)   
     return -INF;   
   mj=(li+lf)>>1;   
   return MAX( query(ind << 1,li,mj,A,B) , query((ind << 1)|1,mj+1,lf,A,B) );   
}   
  
void update(int nod, int left, int right)      
{      
     if ( left == right )      
     {      
          arb[nod] = B;      
          return;      
     }      
           
     int div = (left+right)/2;      
     if ( A <= div ) update(nod << 1,left,div);      
     else              update((nod << 1)|1,div+1,right);      
           
     arb[nod] = MAX( arb[nod << 1], arb[(nod << 1)|1] );      
}     
  
  
int main()   
 {   
     freopen("arbint.in","r",stdin);   
     freopen("arbint.out","w",stdout);   
  
     scanf("%d %d",&N,&M);   
     for (i=1; i<=N; i++)
     {
          int c;
          scanf("%d",&c);
          A = i;
          B = c;
          update (1, 1, N);
     }   
  
//     buildtree(1,1,N);   
  
     for (i=1; i<=M; i++)   
      {   
        int x;          
        scanf("%d %d %d",&x,&A,&B);    
        if (!x)    
        {     
                ANSWER = query(1,1,N,A,B);   
                printf("%d\n",ANSWER);   
        }   
        else update (1, 1, N);   
      }   
        
     return 0;   
}