Cod sursa(job #395191)

Utilizator arnold23Arnold Tempfli arnold23 Data 12 februarie 2010 13:47:41
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
// intervallumfa

#include <stdio.h>

long fa[300010];  // lehet nagyobb kell
long x,i,n,m,op,a,b,maxi;

long maxim(long q, long w)
{
 if(q>w) { return q; } else { return w; };  
}

// betesszuk a faba
int update(long val,long poz,long nod,long bal,long jobb)
{
 long koz;   
 if(bal==jobb)
 { fa[nod]=val; }
 else 
 {   
  koz=bal+(jobb-bal)/2;
  if(poz<=koz)
  { update(val,poz,2*nod,bal,koz); }
   else 
  { update(val,poz,2*nod+1,koz+1,jobb); }   
  fa[nod]=maxim(fa[2*nod],fa[2*nod+1]);
 }  
 return 0;    
}

// lekerdezzuk a fabol a max ot
int query(long nod,long bal,long jobb,long kezd,long veg)
{
 long k;   
 if(kezd<=bal&&veg>=jobb)
 { maxi=maxim(maxi,fa[nod]); }   
 else
 {
   k=bal+(jobb-bal)/2;
   if(kezd<=k) query(2*nod,bal,k,kezd,veg);
   if(veg>k) query(2*nod+1,k+1,jobb,kezd,veg);    
 }
    
 return 0;
}

int main()
{
 freopen("arbint.in","r",stdin);
 freopen("arbint.out","w",stdout);
 
 scanf("%ld %ld\n",&n, &m);
 for(i=1;i<=n;++i)
 {
  scanf("%ld ",&x);
  update(x,i,1,1,n);                 
 }   
 scanf("\n");
 for(i=1;i<=m;++i)
 {
  scanf("%ld %ld %ld\n",&op,&a,&b);
  if(op==0) 
  {
   maxi=0;
   query(1,1,n,a,b);
   printf("%ld\n",maxi);
  } else
  {
   update(b,a,1,1,n);      
  }                
 }
    
 return 0;    
}