Cod sursa(job #2763189)

Utilizator TeodorLuchianovTeo Luchianov TeodorLuchianov Data 12 iulie 2021 11:45:15
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.9 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int const NMAX = 1e5;
int arr[1 + NMAX];
int rmq[32][1 + NMAX];

int n, nq;

void buildRMQ() {
  for(int j = 0;j <= 17;j++){
    for(int i = 1;i + (1 << j) - 1 <= n;i++){
      if(j == 0){
        rmq[j][i] = arr[i];
      }else{
        rmq[j][i] = min(rmq[j-1][i], rmq[j-1][i + (1 << (j-1))]);
      }
    }
  }
}

int lg(int length) {
  return 31 - __builtin_clz(length);
}

int computeRMQ(int left, int right){
  int length = right - left + 1;
  return min(rmq[lg(length)][left], rmq[lg(length)][right - (1 << lg(length)) + 1]);
}

int main() {

  in >> n >> nq;
  for(int i = 1;i <= n;i++){
    in >> arr[i];
  }
  buildRMQ();
  int left, right;
  for(int i = 1;i <= nq;i++){
    in >> left >> right;
    out << computeRMQ(left, right);
  }
  return 0;
}