Cod sursa(job #2015172)

Utilizator Stefan_RaduStefan Radu Stefan_Radu Data 25 august 2017 13:47:20
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include <fstream>
#include <vector>
#include <cmath>

using namespace std;

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

const int INF = 1e9;

int sol(int a, int b, vector < vector < int > > &dp) {
  int d = b - a + 1;
  int l = log2(d);
  int s2 = b - (1 << l) + 1;
  return min(dp[l][a], dp[l][s2]);
}

int main() {
  int n, m;
  cin >> n >> m;
  vector < int > v(n + 1);
  for (int i = 1; i <= n; i ++) {
    cin >> v[i];
  }

  vector < vector < int > > dp(floor(log2(n)) + 1, vector < int > (n + 1, INF));

  for (int i = 1; i <= n; i ++) {
    dp[0][i] = v[i];
  }

  for (int i = 1; i <= (int)log2(n); i ++) {
    for (int j = 1; j <= n; j ++) {
      int l = (1 << (i - 1));
      if (j + l > n)
        break;
      dp[i][j] = min(dp[i - 1][j], dp[i - 1][j + l]);
    }
  }

  for (int i = 1; i <= m; i ++) {
    int a, b;
    cin >> a >> b;
    cout << sol(a, b, dp) << '\n';
  }
}