Cod sursa(job #2799246)

Utilizator TeodorLuchianovTeo Luchianov TeodorLuchianov Data 12 noiembrie 2021 18:21:39
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.75 kb
#include <fstream>
#include <cmath>

using namespace std;

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

int const LOGMAX = 20;

int const NMAX = 2e5;
int rmq[LOGMAX][1 + NMAX];

void precomputeRMQ(int n) {
  for(int j = 1;(1 << j) <= n;j++){
    for(int i = 1;i <= n;i++) {
      rmq[j][i] = min(rmq[j-1][i], rmq[j-1][i + (1 << (j-1))]);
    }
  }
}

int calculateLOG(int n) {
  return (31 - __builtin_clz(n));
}

int main() {

  int n, t;
  in >> n >> t;
  for(int i = 1;i <= n;i++){
    in >> rmq[0][i];
  }
  precomputeRMQ(n);
  for(int q = 1;q <= t;q++){
    int a, b;
    in >> a >> b;
    int log = calculateLOG(abs(a - b) + 1);
    out << min(rmq[log][a], rmq[log][b - (1 << log) + 1]) << '\n';
  }
  return 0;
}