Cod sursa(job #2035844)

Utilizator DruffbaumPopescu Vlad Druffbaum Data 9 octombrie 2017 21:24:17
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.83 kb
#include <cstdio>

const int MAXN = 1e5;
const int LOG  = 17;

int rmq[LOG + 1][MAXN + 1],
    lg[MAXN + 1];

inline int min(int a, int b) {
  return a > b ? b : a;
}

int main() {
  int n, m, a, b, k;
  FILE *fin = fopen("rmq.in", "r");
  fscanf(fin, "%d%d", &n, &m);
  for (int i = 1; i <= n; ++i) {
    fscanf(fin, "%d", &rmq[0][i]);
  }
  for (int i = 1; (1 << i) <= n; ++i) {
    for (int j = 1; j + (1 << i) - 1 <= n; ++j) {
      rmq[i][j] = min(rmq[i - 1][j], rmq[i - 1][j + (1 << (i - 1))]);
    }
  }
  for (int i = 2; i <= n; ++i) {
    lg[i] = lg[i >> 1] + 1;
  }
  FILE *fout = fopen("rmq.out", "w");
  for (; m > 0; --m) {
    fscanf(fin, "%d%d", &a, &b);
    k = lg[b - a + 1];
    fprintf(fout, "%d\n", min(rmq[k][a], rmq[k][b - (1 << k) + 1]));
  }
  fclose(fin);
  fclose(fout);
  return 0;
}