Cod sursa(job #2763166)

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

using namespace std;

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

int n, nq;

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

void buildRMQ() {
  int shift = 1;
  for(int j = 1;j <= 17;j++) {
    for(int i = 1;i + shift - 1 <= n;i++){
      if(shift == 1){
        rmq[j][i] = v[i];
      }else{
        rmq[j][i] = min(rmq[j-1][i], rmq[j-1][i + shift / 2]);
      }
      //cout << rmq[j][i] << ' ';
    }
    //cout << '\n';
    shift = shift * 2;
  }
}

int get2pow(int s, int &x) {
  int ans = 0;
  if(s == 1){
    x = 1;
    return 1;
  }
  while(s >= 2){
    s /= 2;
    x *= 2;
    ans++;
  }
  return ans;
}

int computeRMQ(int left, int right) {
  int length = right - left + 1, shift = 1;
  int j = get2pow(length, shift);
  //cout << length << ' ' << j << ' ' << shift << ' ';
  shift /= 2;//Gub gub
  return min(rmq[j][left], rmq[j][right - shift + 1]);
}

int main() {

  int x, y;
  in >> n >> nq;
  for(int i = 1;i <= n;i++){
    in >> v[i];
  }
  buildRMQ();
  //printRMQ();
  for(int i = 1;i <= nq;i++){
    in >> x >> y;
    out << computeRMQ(x, y) << '\n';
  }
  return 0;
}