Cod sursa(job #2572102)

Utilizator bogdanvladmihaiBogdan Vlad-Mihai bogdanvladmihai Data 5 martie 2020 11:41:52
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.88 kb
#include <bits/stdc++.h>

using namespace std;

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

const int MAX_N = 1e5 + 5;
const int MAX_LG = 2e1;

int n, m;

int v[MAX_N];

int rmq[MAX_LG][MAX_N];

int logs[MAX_N];

int query(int lo, int ri) {
  int l, lg;
  l = ri - lo + 1;
  lg = logs[l];
  return min(rmq[lg][lo], rmq[lg][ri - (1 << lg) + 1]);
}

int main() {
  int lo, ri;
  fin >> n >> m;
  for (int i = 2; i <= n; ++i) {
    logs[i] = 1 + logs[i / 2];
  }
  for (int i = 1; i <= n; ++i) {
    fin >> v[i];
    rmq[0][i] = v[i];
  }
  for (int lg = 1; (1 << lg) <= n; ++lg) {
    for (int i = 1; i <= n - (1 << lg) + 1; ++i) {
      rmq[lg][i] = min(rmq[lg - 1][i], rmq[lg - 1][i + (1 << (lg - 1))]);
    }
  }
  while (m --) {
    fin >> lo >> ri;
    if (lo > ri) {
      swap(lo, ri);
    }
    fout << query(lo, ri) << "\n";
  }
  return 0;
}