Cod sursa(job #1106384)

Utilizator danny794Dan Danaila danny794 Data 12 februarie 2014 19:27:41
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include <cstdio>
#include <math.h>

#define MIN(a, b) ((a) > (b) ? (b) : (a))

const int NMAX = 100005;
const int LMAX = 18;

using namespace std;

int N, M, table[NMAX][LMAX];

int find(int a, int b) {
  int x = (int) (log(b - a + 1) / log(2));
  return MIN(table[a][x], table[b - (1 << x) + 1][x]);
}

void read() {
  freopen("rmq.in", "r", stdin);
  freopen("rmq.out", "w", stdout);
  scanf("%i%i", &N, &M);
  for(int i = 1; i <= N; i++)
    scanf("%d", &table[i][0]);
}

void solve() {
  int a, b;
  for(int i = 1; i <= M; i++) {
    scanf("%i %i", &a, &b);
    printf("%i\n", find(a, b));
  }
}

void precompute() {
  for(int step = 1, j = 1; step <= N; step <<= 1, j++) {
    for(int i = 1; i <= N; i++)
      if( i + step <= N)
        table[i][j] = MIN(table[i][j-1], table[i + step][j - 1]);
      else
        table[i][j] = table[i][j-1];
  }
}


int main() {
  read();
  precompute();
  solve();
  return 0;
}