Cod sursa(job #304015)

Utilizator drag0shSandulescu Dragos drag0sh Data 10 aprilie 2009 18:28:11
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <stdio.h>

#define maxn 100000

FILE *in=fopen("arbint.in","r"),*out=fopen("arbint.out","w");

int n,pos,val,start,final,arb[4*maxn+66],rez;

int maxim(int a,int b){
  if(a>b)return a;
  return b;
}

void update(int nod,int left,int right){
  
  //  fprintf(out,"(%d,%d,%d,%d)",left,div,div+1,right);
  if(left==right){
    arb[nod]=val;
    return;
  }
int  div=(left+right)/2;
  if(pos<=div) update(2*nod,left,div);
  else update(2*nod+1,div+1,right);
  arb[nod]=maxim(arb[2*nod],arb[2*nod+1]);
  //  fprintf(out,"(%d,%d,%d,%d)",left,div,div+1,right);
}

void interogare(int nod,int left,int right){
  if(start<=left&&right<=final){
    rez=maxim(rez,arb[nod]);
    return;
  }
  int div=(left+right)/2;
  if(start<=div) interogare(2*nod,left,div);
  if(div<final)interogare(2*nod+1,div+1,right);
  //  fprintf(out,"(%d,%d,%d,%d)<%d,%d>",left,div,div+1,right,arb[2*nod],arb[2*nod+1]);
}


void solve(){
  int i,x,m;
  fscanf(in,"%d%d",&n,&m);
  for(i=1;i<=n;i++){
    fscanf(in,"%d",&x);
    val=x;
    pos=i;
    update(1,1,n);
    //    fprintf(out,"\n");
  }
  
  while(m--){
    int a,b,c;
    fscanf(in,"%d%d%d",&a,&b,&c);
    if(a==0){
      rez=-1;
      start=b;
      final=c;
      interogare(1,1,n);
      fprintf(out,"%d\n",rez);
    }
    else{ 
      pos=b;
      val=c;
      update(1,1,n);
    }
  }
  

}



int main(){
  solve();


  
  
  fclose(in);
  fclose(out);
  return 0;
}