Cod sursa(job #2395971)

Utilizator Robert_VRVRobert Vadastreanu Robert_VRV Data 3 aprilie 2019 09:08:45
Problema Range minimum query Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.8 kb
#include <algorithm>
#include <stdio.h>

const int MAX_N = 100000;

int rmq[1 + MAX_N][18];
int lg[1 + MAX_N];

int main() {

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

  int n, Q;
  scanf("%d%d", &n, &Q);
  for (int i = 1; i <= n; i++)
	scanf("%d", &rmq[0][i]);
  lg[1] = 0;
  for (int i = 2; i <= n; i++)
    lg[i] = lg[i / 2] + 1;
  for (int i = 1; (1 << i) <= n; i++)
    for (int j = 1; j + (1 << i) - 1 <= n; j++) {
	  int size = 1 << (i - 1);
      rmq[i][j] = std::min(rmq[i - 1][j], rmq[i - 1][j + size]);
    }
  for (int q = 1; q <= Q; q++) {
    int x, y;
    scanf("%d%d", &x, &y);
    int size = y - x + 1;
    int pow = lg[size];
    size = size - (1 << pow);
    printf("%d\n", std::min(rmq[pow][x], rmq[pow][x + size]));
  }

  return 0;
}