Cod sursa(job #212090)

Utilizator marinMari n marin Data 4 octombrie 2008 13:45:48
Problema Arbori de intervale Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <stdio.h>
#define DIM 200

int n,m;
int v[DIM];

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

int query(int st, int dr, int nod, int a, int b) {
  int max,x,mij;
  if ((a<=st) && (dr<=b)){
    return v[nod];
  } else {
    mij = (st+dr)/2;
    max =-1;
    if (a<=mij) {
      x = query(st, mij, 2*nod, a, b);
      if (x>max)
	max = x;
    }
    if (b>mij) {
      x = query(mij+1,dr, 2*nod+1, a, b);
      if (x>max)
	max = x;
    }
    return max;
  }
}


int main() {
  int val,poz,a,b,op,i;
  FILE *f = fopen("arbint.in","r");;
  FILE *g = fopen("arbint.out","w");;

  fscanf(f,"%d %d",&n,&m);
  for (i=1;i<=n;i++) {
    fscanf(f,"%d",&val);
    update(1,n,1,i,val);
  }
  for (i=1;i<=m;i++) {
    fscanf(f,"%d",&op);
    if (op==0) {
      fscanf(f,"%d %d",&a, &b);
      fprintf(g,"%d\n",query(1,n,1,a,b));
    } else {
      fscanf(f,"%d %d",&poz, &val);
      update(1,n,1,poz,val);
    }
  }

  fclose(g);
  fclose(f);
  return 0;
}