Cod sursa(job #3142818)

Utilizator RolandPetreanPetrean Roland RolandPetrean Data 24 iulie 2023 17:54:34
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.73 kb
// https://infoarena.ro/problema/rmq
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'

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

int main() {
  int n, m;
  fin>>n>>m;
  
  vector<int> a(n+1);
  for (int i=1; i<=n; ++i) fin>>a[i];

  vector<vector<int>> rmq(18, vector<int>(n+1));
  for (int i=1; i<=n; ++i) rmq[0][i] = a[i];
  for (int h=1; h<18; ++h) {
    for (int i=1; i<=n; ++i) {
      rmq[h][i] = rmq[h-1][i];
      if (i + (1<<h) - 1 <= n) rmq[h][i] = min(rmq[h][i], rmq[h-1][i+(1<<(h-1))]);
    }
  }

  auto query_rmq = [&](int l, int r) {
    int lg = log2(r-l+1);
    return min(rmq[lg][l], rmq[lg][r-(1<<lg)+1]);
  };

  for (int i=0; i<m; ++i) {
    int l, r;
    fin>>l>>r;
    fout<<query_rmq(l, r)<<endl;
  }
}