Cod sursa(job #2760587)

Utilizator retrogradLucian Bicsi retrograd Data 28 iunie 2021 00:30:31
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.93 kb
#include <bits/stdc++.h>

using namespace std;

int lg(int x) { return 31 - __builtin_clz(x); }

struct RMQ{
  vector<int> dp[32];

  RMQ(const vector<int> &v) {
    int n = v.size();
    for (int step = 0; (1 << step) <= n; ++step){
      dp[step].resize(n + 1, 1e9);
      for (int l = (1 << step), c = l; c < n + l; c += (l << 1)){
        for (int i = c + 1; i <= min(n, c + l); i++)
          dp[step][i] = min(dp[step][i - 1], v[i - 1]);
        for (int i = min(n, c) - 1; i >= c - l; i--)
          dp[step][i] = min(v[i], dp[step][i + 1]);
      }
    }
  }
  int Query(int l, int r){
    int h = lg(l ^ r);
    return min(dp[h][l], dp[h][r]);
  }
};

int main() {
  ifstream cin("rmq.in");
  ofstream cout("rmq.out");
  int n, m; cin >> n >> m;
  vector<int> v(n);
  for (int i = 0; i < n; ++i)
    cin >> v[i];
  RMQ rmq(v);
  for (int i = 0; i < m; ++i) {
    int a, b; cin >> a >> b;
    cout << rmq.Query(a - 1, b) << '\n';
  }
  return 0;
}