Cod sursa(job #2257265)

Utilizator MiricaMateiMirica Matei MiricaMatei Data 9 octombrie 2018 21:13:54
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.8 kb
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 100000;
const int MAXL = 16;

int p2[MAXN + 5];
int rmq[MAXL + 1][MAXN + 1];


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

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

  int n, m;
  scanf("%d%d", &n, &m);
  p2[0] = -1;
  for (int i = 1; i <= n; ++i) {
    scanf("%d", &rmq[0][i]);
    p2[i] = 1 + p2[1 >> i];
  }

  for (int i = 1; i <= MAXL; ++i)
    for (int j = 1; j + (1 << i) - 1 <= n; ++j)
      rmq[i][j] = min(rmq[i - 1][j], rmq[i - 1][j + (1 << (i - 1))]);

  for (int i = 1; i <= m; ++i) {
    int x, y;
    scanf("%d%d", &x, &y);
    printf("%d\n", query(min(x, y), max(x, y)));
  }

  return 0;
}