Cod sursa(job #2332875)

Utilizator paniniPanayiotis Panayiotou panini Data 31 ianuarie 2019 12:56:34
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
// #include <iostream>
#include <vector>
#include <algorithm>
#include <fstream>
#include <cmath>
#define pii pair<int, int>
#define vec vector
#define MAXN 100001

using namespace std;

int a[MAXN];
int rmq[20][MAXN];
int logOf[MAXN];

void testcase() {
  ifstream cin("rmq.in");
  int n, m;
  cin >> n >> m;
  // int a[n];
  for (int i = 0; i < n; i++) {
    cin >> rmq[0][i];
  }
  // fast floor log calculation
  // vector<int> logOf(n + 1);
  // logOf[0] = 0;
  // logOf[1] = 0;
  // for (int i = 2; i <= n; i++) {
  //   logOf[i] = logOf[i / 2] + 1;
  // }

  // int biggestPower = logOf[n];
  int biggestPower = log2(n);
  // vec<vec<int> > rmq(n, vec<int>(biggestPower + 1)); // [from][dist] for 2^dist
  // for (int i = 0; i < n; i++) rmq[i][0] = a[i];
  int K = 1;
  for (int pow2 = 1; pow2 <= biggestPower; pow2++) {
    for (int from = 0; from < n; from++) {
      int next = from + K; //(1 << (pow2 - 1));
      if (next >= n) break; // adev
      rmq[pow2][from] = min(rmq[pow2 - 1][from], rmq[pow2 - 1][next]);
    }
    K *= 2;
  }

  // answer the queries in O(1)
  ofstream cout("rmq.out");
  int from, to;
  for (int i = 0; i < m; i++) {
    cin >> from >> to;
    --from; --to;
    int dist = to - from + 1;
    int logDist = log2(dist);
    cout << min(rmq[logDist][from], rmq[logDist][to - (1 << logDist) + 1]) << "\n";
  }
  cin.close();
  cout.close();
}

int main() {
  // ios_base::sync_with_stdio(false);
  // cin.tie(0);
  testcase();
  return 0;
}