Cod sursa(job #2035024)

Utilizator MoodyFaresFares Mohamad MoodyFares Data 8 octombrie 2017 20:52:25
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.75 kb
#include <cstdio>
#include <algorithm>

const int MAX_N = 100000;

int a[5 + MAX_N];
int rmq[5 + MAX_N][20];

int exp2(int x) {
  int k = -1;
  for (int i = 1; i <= x; i += i) {
    k++;
  }
  return k;
}

int main() {
  freopen("rmq.in", "r", stdin);
  freopen("rmq.out", "w", stdout);

  int N, M;
  scanf("%d%d", &N, &M);
  for (int i = 1; i <= N; i++) {
    scanf("%d", &a[i]);
    rmq[i][0] = a[i];
  }
  for (int j = 1; 1 << j <= N; j++) {
    for (int i = 1; i + (1 << j) - 1 <= N; i++) {
      rmq[i][j] = std::min(rmq[i][j - 1], rmq[i + (1 << (j - 1))][j - 1]);
    }
  }
  for (int i = 1; i <= M; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    int k = exp2(y - x + 1);
    printf("%d\n", std::min(rmq[x][k], rmq[y - (1 << k) + 1][k]));
  }
  return 0;
}