Cod sursa(job #2238929)

Utilizator al3xionescuIonescu Alexandru al3xionescu Data 8 septembrie 2018 14:02:58
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <cmath>
#include <cstdio>
#include <vector>
#include <utility>
 
class RMQ {
 public:
  RMQ(int n) {
    int size = (int) (std::log(n) / std::log(2)) + 1;
    matrix.resize(n);
    for (auto &row : matrix) {
      row.resize(size);
    }
  }
 
  void read() {
    for (auto &row : matrix) {
      scanf("%d", &row.front());
    }
  }
 
  void buildMatrix() {
    size_t pos = 0;
    for (size_t d = 1; d < matrix.front().size(); d++) {
      for (size_t idx = 0; idx < matrix.size(); idx++) {
        pos = idx + (1 << (d - 1));
        if (pos < matrix.size()) {
          matrix[idx][d] = std::min(matrix[idx][d - 1], matrix[pos][d - 1]);
        } else {
          matrix[idx][d] = matrix[idx][d - 1];
        }
      }
    }
  }
 
  int findMin(int a, int b) {
    if (a > b) {
      std::swap(a, b);
    }
    size_t d = (size_t) (std::log(b - a + 1) / std::log(2));
    return std::min(matrix[a][d], matrix[b - (1 << d) + 1][d]);
  }
 
 private:
  std::vector<std::vector<int>> matrix;
};
 
int main() {
  freopen("rmq.in", "r", stdin);
  freopen("rmq.out", "w", stdout);
  int n, m, a, b;
  scanf("%d %d", &n, &m);
  RMQ rmq(n);
  rmq.read();
  rmq.buildMatrix();
  while (m-- > 0) {
    scanf("%d %d", &a, &b);
    printf("%d\n", rmq.findMin(a - 1, b - 1));
  }
  return 0;
}