Cod sursa(job #201025)

Utilizator marinMari n marin Data 28 iulie 2008 16:45:15
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <stdio.h>
#define DIM 200009

long long int v[DIM];
long long int n,m,i,a,b,x1,y1,x,op;

void update(int nod, int poz, int value, int st, int dr){
  if ((st==poz) && (dr==poz)) {
    v[nod] = value;
  } else {
    long long int m=(st+dr)/2;
    if (m>=poz) update(2*nod,poz,value,st,m);
    if (m+1<=poz) update(2*nod+1,poz,value,m+1,dr);

    if (v[2*nod]>v[2*nod+1]) v[nod] = v[2*nod];
    else v[nod] = v[2*nod+1];
  }

}

int query(int nod, int a, int b, int st, int dr) {
  if ((st>=a) && (dr<=b))
    return v[nod];
  long long int m = (st+dr)/2;

  long int max1=-1;
  long int max2=-1;
  if (m>=a) max1 = query(2*nod,a,b,st,m);
  if (b>=m+1) max2 = query(2*nod+1,a,b,m+1,dr);

  if (max1>max2) return max1;
  else return max2;
}


int main(){
  FILE *f = fopen("arbint.in","r");
  FILE *g = fopen("arbint.out","w");
  fscanf(f,"%lld %lld", &n, &m);
  for (i=1;i<=n;i++) {
    fscanf(f,"%lld",&x);
    update(1,i,x,1,n);
  }
  for (i=1;i<=m;i++) {
    fscanf(f,"%lld",&op);
    if (op==1) {
      fscanf(f,"%lld %lld", &a, &b);
      update(1,a,b,1,n);
    } else {
      fscanf(f,"%lld %lld",&a, &b);
      long int Temp = query(1,a,b,1,n);
      fprintf(g,"%lld\n", Temp);
    }
  }
  fclose(f);
  fclose(g);
  return 0;
}