Cod sursa(job #2816757)

Utilizator Teodor94Teodor Plop Teodor94 Data 12 decembrie 2021 00:29:59
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
#include <stdio.h>

#define MAX_N 100000
#define MAX_LOG 16

int v[MAX_N];

int log2[MAX_N + 1];
int table[MAX_N][MAX_LOG + 1];

inline int f(int x, int y) {
  return x < y ? x : y;
}

void precomputeLogs(int n) {
  int i;

  log2[1] = 0;

  for (i = 2; i <= n; ++i)
    log2[i] = log2[i / 2] + 1;
}

void build(int n) {
  int i, p;

  for (i = 0; i < n; ++i)
    table[i][0] = v[i];

  for (p = 1; p <= MAX_LOG; ++p)
    for (i = 0; i + (1 << p) - 1 < n; ++i)
      table[i][p] = f(table[i][p - 1], table[i + (1 << (p - 1))][p - 1]);
}

int query(int left, int right) {
  int len, log;

  len = (right - left + 1);
  log = log2[len];

  return f(table[left][log], table[right - (1 << log) + 1][log]);
}

int main() {
  FILE *fin, *fout;
  fin = fopen("rmq.in", "r");
  fout = fopen("rmq.out", "w");

  int n, m, i, a, b;

  fscanf(fin, "%d%d", &n, &m);
  for (i = 0; i < n; ++i)
    fscanf(fin, "%d", &v[i]);

  precomputeLogs(n);
  build(n);

  while (m--) {
    fscanf(fin, "%d%d", &a, &b);
    fprintf(fout, "%d\n", query(a - 1, b - 1));
  }

  fclose(fin);
  fclose(fout);
  return 0;
}