Cod sursa(job #2772105)

Utilizator avtobusAvtobus avtobus Data 30 august 2021 19:06:16
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.91 kb
#include <stdio.h>
#include <bits/stdc++.h>

#define rep(i, n) for(int i = 0; i < (int)(n); i++)

using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<ll> vll;

int main(void) {
  freopen("rmq.in", "r", stdin);
  freopen("rmq.out", "w", stdout);
  std::ios_base::sync_with_stdio(false);
  std::cin.tie(NULL);

  int n,m;
  cin >> n >> m;
  vi a(n), lg(n+1);
  rep(i, n) { cin >> a[i]; }
  lg[1] = 0;
  for(int i = 2; i <= n; i++) { lg[i] = lg[i/2] + 1; }
  int K = lg[n];
  vector<vi> mn(K+1, vi(n));
  copy(a.begin(), a.end(), mn[0].begin());
  for(int k = 1; k <= K; k++) {
    for(int i = 0; i + (1<<(k-1)) < n; i++) {
      mn[k][i] = min(mn[k-1][i], mn[k-1][i + (1<<(k-1))]);
    }
  }
  int l,r;
  while(m--) {
    cin >> l >> r;
    --l;
    int step = lg[r-l];
    cout << min(mn[step][l], mn[step][r-(1<<step)]) << "\n";
  }

  return 0;
}