Cod sursa(job #2901779)

Utilizator vladisimovlad coneschi vladisimo Data 14 mai 2022 14:08:06
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.1 kb
#include <fstream>

const int MAX = 100000;
const int LOGMAX = 18;

long long lg[2 + MAX], h[2 + MAX], rmq[2 + LOGMAX][2 + MAX];
long long sum[2 + MAX];

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

int main() {
  int n, nrQueries;
  fin >> n >> nrQueries;
  sum[0] = 0;
  for (int i = 1; i <= n; i++) {
    long long l;
    fin >> h[i];
    //std::cin >> l >> h[i];
   // sum[i] = 1LL * (sum[i - 1] + 1LL * l);
  }
  lg[1] = 0;
  for (int i = 2; i <= n; i++)
    lg[i] = lg[i / 2] + 1;
  for (int i = 1; i <= n; i++)
    rmq[0][i] = h[i];
  for (int i = 1; (1 << i) <= n; i++)
    for (int j = 1; j <= n - (1 << i) + 1; j++) {
      int l = 1 << (i - 1);
      rmq[i][j]= std::min(rmq[i - 1][j], rmq[i - 1][j + l]);
    }
//  int nrQueries;
 // fin >> nrQueries;
  for (int i = 1; i <= nrQueries; i++) {
    long long l, r;
    fin >> l >> r;
    long long diff = r - l + 1;
    long long log = lg[diff];
    long long sh = diff - (1 << log);
    fout << 1LL * (std::min(rmq[log][l], rmq[log][l + sh])) << '\n'; //* 1LL * (sum[r] - sum[l - 1]) << '\n';
  }
  return 0;
}