Cod sursa(job #3318787)

Utilizator rrfeierFeier Raul rrfeier Data 28 octombrie 2025 20:01:25
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.97 kb
#include <bits/stdc++.h>
#include <fstream>

using namespace std;

class RMQ {
private:
  vector<vector<int>> st;

public:
  RMQ(vector<int> &a) {
    st.resize(a.size() + 1, vector<int>(20)); // 0 indexed array

    for (int i = 0; i < a.size(); i++) {
      // cout << a[i] << " ";
      st[i + 1][0] = a[i];
    }
    // cout << '\n';

    for (int j = 1; j < 20; j++) {
      for (int i = 1; i + (1 << j) - 1 <= a.size(); i++) {
        st[i][j] = min(st[i][j - 1], st[i + (1 << (j - 1))][j - 1]);
      }
    }
  }

  int querie(int L, int R) {
    int j = 31 - __builtin_clz(R - L + 1);
    return min(st[L][j], st[R - (1 << j) + 1][j]);
  }
};

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);

  ifstream cin{"rmq.in"};
  ofstream cout{"rmq.out"};

  int N, Q;
  cin >> N >> Q;

  vector<int> a(N);

  for (auto &c : a)
    cin >> c;

  RMQ rmq(a);

  while (Q--) {
    int a, b;
    cin >> a >> b;

    cout << rmq.querie(a, b) << '\n';
  }

  return 0;
}