Cod sursa(job #145591)

Utilizator alexeiIacob Radu alexei Data 28 februarie 2008 23:38:02
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include<stdio.h>
#define nmax 100000
#define max(a,b) ((a)>(b)?(a):(b))

int Arb[nmax*4],a[nmax];
int val,pos,sol;
int aux1,aux2,aux3;
//misto algoritm :D 
//I really feel like I learned something today :)

void maxim(int nod,int left,int right)
{

     if( aux2 <= left && aux3 >= right)
        sol=max(sol,Arb[nod]);
     else
     {
         int mij=(left+right)/2;
         if( aux2<=mij ) maxim(2*nod,left,mij); 
         if( mij < aux3) maxim(2*nod+1,mij+1,right);
         }

}
void update(int nod ,int left, int right)
{ 
 
   if( left == right )
   Arb[nod]=val;
   else
   {  
    int mij=(left+right)/2;
   
    if( pos <= mij ) update( 2*nod ,left,mij);
     else    update( 2*nod+1,mij+1,right);
   
     Arb[nod] = max( Arb[2*nod], Arb[2*nod+1] );
   
   }
}

int main()
{
 freopen("arbint.in","r",stdin);
 freopen("arbint.out","w",stdout);
 
 int n,m,i;
 
 scanf("%d%d",&n,&m);
 
 for(i=1; i<=n; ++i){
 scanf("%d",&a[i]);
 pos=i; val=a[i];
 update(1,1,n);
}
/*
    for(int i=1; i<=n; ++i)
    printf("%d ",Arb[i]);*/
    
 for(i=1; i<=m; ++i){
 scanf("%d%d%d",&aux1,&aux2,&aux3);
  
  if( !aux1 )
  {
      sol=-1;
      
      maxim(1,1,n);
      
      printf("%d\n",sol);
      }    
  else
  {  
    pos=aux2; val=aux3;
    update(1,1,n);
    }
                  }
    
    
    return 0;
}