Cod sursa(job #1547652)

Utilizator tudorcomanTudor Coman tudorcoman Data 9 decembrie 2015 18:31:45
Problema Range minimum query Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 0.81 kb

#include <cstdio>
#include <algorithm>

using std :: min;

const int maxN = 100000;

int rmq[20][maxN];
int Log[maxN];

int query(int x, int y) {
  int l = y - x + 1;
  int step = Log[l];
  return min(rmq[step][x], rmq[step][y - (1 << step) + 1]);
}

int main() {
  freopen("rmq.in", "r", stdin);
  freopen("rmq.out", "w", stdout);
  int N, T;
  scanf("%d %d", &N, &T);
  for(int i = 0; i < N; ++ i)
    scanf("%d", &rmq[0][i]);

  for(int i = 2; i <= N; ++ i)
    Log[i] = Log[i >> 1] + 1;
  for(int step = 1; step <= Log[N]; ++ step) {
    for(int i = 0; i + (1 << (step - 1)) < N; ++ i)
      rmq[step][i] = min(rmq[step - 1][i], rmq[step - 1][i + (1 << (step - 1))]);
  }

  int x, y;
  while(T --) {
    scanf("%d %d", &x, &y);
    printf("%d\n", query(x - 1, y - 1));
  }
  return 0;
}