Cod sursa(job #3242807)

Utilizator rockoanaOana Pasca rockoana Data 14 septembrie 2024 10:06:13
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'

using i3 = int32_t;
using i64 = int64_t;

int lg[100002];

class rmq {
 private:
  int rq[18][100002];

 public:
  rmq(int n, vector<int>& v) {
    for (int i = 1; i <= n; i++) {
      if (i > 1) {
        lg[i] = lg[i / 2] + 1;
      } else {
        lg[i] = 0;
      }

      rq[0][i] = v[i];
    }
    lg[n] = lg[n / 2] + 1;

    for (int i = 1; (1 << i) <= n; i++) {
      for (int j = 1; j <= n - (1 << i) + 1; j++) {
        rq[i][j] = min(rq[i - 1][j], rq[i - 1][j + (1 << (i - 1))]);
      }
    }
  }

  int query(int l, int r) {
    return min(rq[lg[l]][l], rq[lg[l]][r - (1 << lg[l]) + 1]);
  }
};

int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  // #ifdef LOCAL
  //   ifstream cin{"input.txt"};
  //   ofstream cout{"output.txt"};
  // #endif

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

  int n, m;
  cin >> n >> m;

  vector<int> v(n + 1);
  for (int i = 1; i <= n; i++) {
    cin >> v[i];
  }

  rmq rq(n, v);
  int l, r;
  for (int i = 0; i < m; i++) {
    cin >> l >> r;
    cout << rq.query(l, r) << endl;
  }

  return 0;
}