Cod sursa(job #3294901)

Utilizator StefanL2005Stefan Leustean StefanL2005 Data 30 aprilie 2025 10:47:58
Problema Range minimum query Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.04 kb
#include <iostream>
#include <vector>
#include <cmath>
#include <fstream>
using namespace std;
#define MAX 100000000

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

// Sparse Table
int log_n(int n) {
  if (n <= 0) return 0;
  int i = 0;
  int p = 1;

  while (p * 2 <= n) {
    i++;
    p *= 2;
  }
  return i;
}

int main() {
  int n, Q;
  in >> n >> Q;
  vector<int> v(n);
  for (int i = 0; i < n; i++) {
    in >> v[i];
  }

  int log = log_n(n);
  vector< vector<int> > sparse (n, vector<int>(log + 1));
  for (int i = 0; i < n; i++)
    sparse[i][0] = v[i];


  for (int j = 1; j <= log; j++)
    for (int i = 0; i < n; i++)
      if (i + (1 << j) - 1 < n)
        sparse[i][j] = min(sparse[i][j - 1], sparse[i + (1 << (j - 1))][j - 1]);
      else
        sparse[i][j] = MAX;

  for (int querry = 0; querry < Q; querry++) {
    int i, j; in >> i >> j; i--; j--;
    int Min, logij = log_n(j - i + 1);

    Min = min(sparse[i][logij], sparse[j - (1 << logij) + 1][logij]);

    out << Min << endl;

    // 0 -  6
    // 2
    // 0 -> 3 2 -> 6
  }


  return 0;
}