Cod sursa(job #303979)

Utilizator drag0shSandulescu Dragos drag0sh Data 10 aprilie 2009 17:30:24
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <stdio.h>

#define maxn 100000

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

int v[maxn],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){
  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]);
}

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,final);
}


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);
  }
  
  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;
}