Cod sursa(job #255097)

Utilizator drag0shSandulescu Dragos drag0sh Data 8 februarie 2009 17:09:19
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <stdio.h>

#define in "arbint.in"
#define out "arbint.out"
#define dim 100001

FILE *f=fopen(in,"r"),*g=fopen(out,"w");

int m,n,maxarb[4*dim+66];
int start,finish,val,pos,maxim;

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

void actualizare(int,int,int);
void interogare(int,int,int);


int main(){
  int x,a,b,i;
  fscanf(f,"%d%d",&n,&m);
  for(i=1;i<=n;i++){
    fscanf(f,"%d",&x);
    pos=i;
    val=x;
    actualizare(1,1,n);
  }
  for(i=1;i<=m;i++){
    fscanf(f,"%d%d%d",&x,&a,&b);
    if(!x){
      maxim=-1;
      start=a,finish=b;
      interogare(1,1,n);
      fprintf(g,"%d\n",maxim);
    }
    else{
      pos=a;
      val=b;
      actualizare(1,1,n);
    }
  }
  fclose(f);
  fclose(g);
  return 0;
}

void actualizare(int nod,int stanga,int dreapta){
  if(stanga==dreapta){
    maxarb[nod]=val;
    return;
  }

  int div;
  div=(stanga+dreapta)/2;
  if(pos<=div) actualizare(2*nod,stanga,div);
  else actualizare(2*nod+1,div+1,dreapta);

  maxarb[nod]=Maxim(maxarb[2*nod],maxarb[2*nod+1]);
}

void interogare(int nod,int stanga,int dreapta){
  if(start<=stanga&&dreapta<=finish){
    maxim=Maxim(maxim,maxarb[nod]);
    return;
  }
  
  int div;
  div=(stanga+dreapta)/2;
  if(start<=div) interogare(2*nod,stanga,div);
  if(div<finish) interogare(2*nod+1,div+1,dreapta);
}