Cod sursa(job #2783618)

Utilizator YusyBossFares Yusuf YusyBoss Data 14 octombrie 2021 19:57:43
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.95 kb
#include <fstream>
#define NMAX 100000
#define LOG2 17

using namespace std;

ifstream cin ("rmq.in");
ofstream cout ("rmq.out");

int v[NMAX + 1], rmq[LOG2][NMAX], vlog2[NMAX + 1];

int minim(int a, int b) {
  return a < b ? a : b;
}

void prec_rmq(int n) {
  int i, j;

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

  for (i = 1; (1 << i) <= n; i++)
    for (j = 1; j <= n; j++)
      rmq[i][j] = minim(rmq[i - 1][j], rmq[i - 1][j + (1 << i - 1)]);
}

void prec_log(int n) {
  int i;
  vlog2[1] = 0;
  for (i = 2; i <= n; i++)
    vlog2[i] = vlog2[i / 2] + 1;
}

int query(int st, int dr) {
  return minim(rmq[vlog2[dr - st + 1]][st], rmq[vlog2[dr - st + 1]][dr - (1 << vlog2[dr - st + 1]) + 1]);
}

int main() {
  int n, m, i, a, b;
  cin >> n >> m;

  for (i = 1; i <= n; i++)
    cin >> v[i];

  prec_log(n);
  prec_rmq(n);

  while (m--) {
    cin >> a >> b;
    cout << query(a, b) << "\n";
  }
  return 0;
}