Cod sursa(job #1106700)

Utilizator andrei.sfrentSfrent Andrei andrei.sfrent Data 13 februarie 2014 02:12:59
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include <cstdio>

using namespace std;

int N, M;
int v[100000];
int r[20][100000];

int log2(int n) {
  int p = 1, l = 0;
  while(p <= n) {
    p *= 2;
    l++;
  }
  return l - 1;
}

int min(int a, int b) {
  if(a < b) return a;
  return b;
}

void preprocess_rmq() {
  for(int i = 0; i < N; ++i) {
    r[0][i] = v[i];
  }

  int l = log2(N);
  for(int k = 1; k <= l; ++k) {
    for(int i = 0; i <= N - (1 << k); ++i) {
      int offset = (1 << (k - 1));
      r[k][i] = min(r[k - 1][i], r[k - 1][i + offset]);
    }
  }
}

int solve(int a, int b) {
  a--, b--;
  int k = log2(b - a + 1);
  int res = min(r[k][a], r[k][b - (1 << k) + 1]);
  return res;
}

int main(int argc, char *argv[]) {
  freopen("rmq.in", "r", stdin);
  freopen("rmq.out", "w", stdout);

  scanf("%d%d", &N, &M);
  for(int i = 0; i < N; ++i) {
    scanf("%d", v + i);
  }

  preprocess_rmq();

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

  return 0;
}