Cod sursa(job #3357421)

Utilizator bogdanvladmihaiBogdan Vlad-Mihai bogdanvladmihai Data 9 iunie 2026 16:28:12
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <cstdint>
#include <cstdio>
#include <iostream>
#include <vector>
#include <bit>

class MinQueryRangeSolver {
public:
  MinQueryRangeSolver(std::vector<int> values)
      : min_on_range(std::bit_width(values.size() + 1),
                     std::vector<int>(values.size())) {
    const auto n = static_cast<int>(values.size());
    min_on_range[0] = values;
    for (int l = 1; (1 << l) <= n; l++) {
      for (int i = 0; i < n - (1 << l) + 1; i++) {
        min_on_range[l][i] = std::min(min_on_range[l - 1][i],
                                      min_on_range[l - 1][i + (1 << (l - 1))]);
      }
    }
  }

  int query(int l, int r) const {
    const auto level = std::bit_width(
        static_cast<uint32_t>(r - l + 1)) - 1; // So this is log(r - l + 1).
    return std::min(min_on_range[level][l],
                    min_on_range[level][r - (1 << level) + 1]);
  }

private:
  std::vector<std::vector<int>> min_on_range;
};

int main() {
  std::freopen("rmq.in", "r", stdin);
  std::freopen("rmq.out", "w", stdout);

  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);

  int n, m;
  std::cin >> n >> m;
  std::vector<int> v(n);
  for (int& x : v) {
    std::cin >> x;
  }

  MinQueryRangeSolver RMQ{std::move(v)};
  for (int i = 0; i < m; i++) {
    int l, r;
    std::cin >> l >> r;
    std::cout << RMQ.query(l - 1, r - 1) << "\n";
  }
  return 0;
}