Cod sursa(job #1672523)

Utilizator stoianmihailStoian Mihail stoianmihail Data 2 aprilie 2016 20:22:06
Problema Range minimum query Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <stdio.h>

#define Nadejde 131072

int N, M, pos, val;
int tree[2 * Nadejde];
int a, b, min;

/** max(X, Y). **/
inline int MIN(int X, int Y) {
  return X < Y ? X : Y;
}

/** Updateaza arborele in nodul "node" -> [left, right], pentru pozitia "pos" si valoarea "val". **/
inline void update(int node, int left, int right) {
  if (left == right) {
    tree[node] = val;
    return;
  }

  int mid = (left + right) >> 1;

  if (pos <= mid) {
    update(2 * node, left, mid);
  } else {
    update(2 * node + 1, mid + 1, right);
  }
  tree[node] = MIN(tree[2 * node], tree[2 * node + 1]);
}

/** Obtine o informatie din nodul "node" -> [left, right], pentru intervalul [a, b]. **/
inline void query(int node, int left, int right) {
  if ((a <= left) && (right <= b)) {
    min = MIN(min, tree[node]);
    return;
  }

  int mid = (left + right) >> 1;

  if (a <= mid) {
    query(2 * node, left, mid);
  }
  if (b > mid) {
    query(2 * node + 1, mid + 1, right);
  }
}

int main(void) {
  int i;
  FILE *f = fopen("rmq.in", "r");

  /* Citirea datelor si construirea arborelui. */
  fscanf(f, "%d %d", &N, &M);
  for (i = 1; i <= N; i++) {
    fscanf(f, "%d", &val);
    pos = i;
    update(1, 1, N);
  }

  /* Citirea intrebarilor si afisarea raspunsurilor. */
  freopen("rmq.out", "w", stdout);
  while (M) {
    fscanf(f, "%d %d", &a, &b);
    min = Nadejde;
    query(1, 1, N);
    fprintf(stdout, "%d\n", min);
    M--;
  }
  fclose(f);
  fclose(stdout);

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