Cod sursa(job #1475479)

Utilizator salam1Florin Salam salam1 Data 24 august 2015 09:30:49
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.81 kb
#include <cstdio>
#include <algorithm>
using namespace std;
const int NMAX = 100505;
const int LMAX = 18;
int n, q, A[LMAX][NMAX], lg[NMAX];

void read() {
  scanf("%d%d", &n, &q);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &A[0][i]);
  }
}

inline int bit(int i) {
  return (1 << i);
}

void prepare() {
  for (int j = 1; (1 << j) <= n; j++) {
    for (int i = 1; i <= n - bit(j) + 1; i++) {
      A[j][i] = min(A[j - 1][i], A[j - 1][i + bit(j - 1)]);
    }
  }
  for (int i = 2; i <= n; i++) {
    lg[i] = lg[i >> 1] + 1;
  }
}

void solve() {
  int a, b;
  while (q--) {
    scanf("%d%d", &a, &b);
    int l = lg[b - a + 1];
    printf("%d\n", min(A[l][a], A[l][b - bit(l) + 1]));
  }
}

int main() {
  freopen("rmq.in", "r", stdin);
  freopen("rmq.out", "w", stdout);
  
  read();
  prepare();
  solve();
  return 0;
}