Cod sursa(job #1700270)

Utilizator TincaMateiTinca Matei TincaMatei Data 9 mai 2016 22:36:34
Problema Arbori de intervale Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.31 kb
#include <stdio.h>
#define MAX_N 100000

int aint[4*MAX_N];

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

void update(int poz, int val, int st, int dr, int nod) {
  int m;
  if(st == dr)
    aint[nod] = val;
  else {
    m = (st + dr) / 2;
    if(poz <= m)
      update(poz, val, st, m, nod * 2 + 1);
    else
      update(poz, val, m + 1, dr, nod * 2 + 2);
    aint[nod] = max(aint[nod * 2 + 1], aint[nod * 2 + 2]);
  }
}

int query(int st, int dr, int stQ, int drQ, int nod) {
  int m, rez;
  m = (st + dr) / 2;
  if( stQ <= st && dr <= drQ )
    return aint[nod];
  else {
    rez = 0;
    if(stQ <= m)
      rez = max(rez, query(st, m, stQ, drQ, nod * 2 + 1));
    if(drQ >= m + 1)
      rez = max(rez, query(m + 1, dr, stQ, drQ, nod * 2 + 2));
    return rez;
  }
}

int main() {
  int i, n, m, com, a, b, x;
  FILE *fin = fopen("arbint.in", "r");
  fscanf(fin, "%d%d", &n, &m);
  for(i = 0; i < n; i++) {
    fscanf(fin, "%d", &x);
    update(i, x, 0, n - 1, 0);
  }

  FILE *fout = fopen("arbint.out", "w");
  for(i = 0; i < m; i++) {
    fscanf(fin, "%d%d%d", &com, &a, &b);
    if(com == 0)
      fprintf(fout, "%d\n", query(0, n - 1, a - 1, b - 1, 0));
    else
      update(a - 1, b, 0, n - 1, 0);
  }
  fclose( fin );
  fclose( fout );
  return 0;
}