Cod sursa(job #2814905)

Utilizator schizofrenieShallan Davar schizofrenie Data 8 decembrie 2021 19:41:26
Problema Range minimum query Scor 10
Compilator c-64 Status done
Runda Arhiva educationala Marime 0.77 kb
#include <math.h>
#include <stdio.h>

#define MIN(p, q) ((p) < (q) ? (p) : (q))

int dp[20][100000];

void
gen_rmq (int n) {
  /* The elements of the vector are on dp[0][...] */
  int i;
  for (i = 1; (1 << i) < n; ++ i) {
    int j;
    for (j = 0; j < n - (1 << i) + 1; ++ j) {
      dp[i][j] = MIN(dp[i - 1][j], dp[i - 1][j + (1 << (i - 1))]);
    }
  }
}

int
min (int a, int b) {
  int dist = log2(b - a);

  return MIN(dp[dist][a],
	     dp[dist][b - 1 - dist]);
}

int main () {
  freopen("rmq.in", "r", stdin);
  freopen("rmq.out", "w", stdout);
  int n, q;
  scanf("%d%d", &n, &q);

  int i;
  for (i = 0; i != n; ++ i)
    scanf("%d", &dp[0][i]);

  gen_rmq(n);

  for (i = 0; i != q; ++ i) {
    int a, b;
    scanf("%d%d", &a, &b);
    printf("%d\n", min(a - 1, b));
  }
}