Cod sursa(job #1480856)

Utilizator stoianmihailStoian Mihail stoianmihail Data 3 septembrie 2015 11:55:49
Problema Arbori de intervale Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.4 kb
#include <stdio.h>

#define Nadejde 100001

int N, M;
int tree[Nadejde << 1];

/** max(X, Y). **/
int MAX(int X, int Y) {
  return (X > Y) ? X : Y;
}

/** Aduna-l pe "val" cu "N". **/
void inc(int *val) {
  (*val) += N;
}

/** Construieste arborele de intervale. **/
void build() {
  int i;
  for (i = N - 1; i > 0; i--) {
    tree[i] = MAX(tree[i << 1], tree[(i << 1) | 1]);
  }
}

/** Pozitia "pos" va primi valoarea "val". **/
void update(int pos, int val) {
  inc(&pos);
  tree[pos] = val;
  while (pos > 1) {
    tree[pos >> 1] = MAX(tree[pos], tree[pos ^ 1]);
    pos >>= 1;
  }
}

/** Gaseste maximul din intervalul "b" -> "e". **/
int query(int b, int e) {
  int u = 0, v = 0;
  inc(&b), inc(&e);
  while (b < e) {
    if (b & 1) {
      u = MAX(u, tree[b++]);
    }
    if (e & 1) {
      v = MAX(v, tree[--e]);
    }
    b >>= 1, e >>= 1;
  }
  return MAX(u, v);
}

int main(void) {
  int i, b, e, task;
  FILE *in = fopen("arbint.in", "r");
  FILE *out = fopen("arbint.out", "w");

  fscanf(in, "%d %d", &N, &M);
  for (i = 0; i < N; i++) {
    fscanf(in, "%d", &tree[i + N]);
  }
  build();
  while (M--) {
    fscanf(in, "%d %d %d", &task, &b, &e);
    if (task) {
      update(b - 1, e);
    } else {
      fprintf(out, "%d\n", query(b - 1, e));
    }
  }
  fclose(in);
  fclose(out);

  /// Multumim Doamne!
  puts("Doamne ajuta!");
  return 0;
}