Cod sursa(job #2156758)

Utilizator stefan_creastaStefan Creasta stefan_creasta Data 8 martie 2018 23:30:39
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.84 kb
#include <cstdio>
#include <algorithm>
using namespace std;
const int NMAX = 100005;
int a[NMAX];
int p2[NMAX];
int nr2[NMAX];
int v[NMAX][40];

int main() {
  int n, m;
  freopen("rmq.in", "r", stdin);
  freopen("rmq.out", "w", stdout);
  scanf("%d%d", &n, &m);
  for(int i = 1; i <= n; ++i) {
    scanf("%d", &a[i]);
    v[i][0] = a[i];
  }
  int put = 0;
  int put2 = 1;
  for(int i = 1; i <= n; ++i) {
    if(i >= 2 * put2) {
      put2 *= 2;
      ++put;
    }
    nr2[i] = put2;
    p2[i] = put;
  }
  for(int l = 1, j = 1; l <= n; l *= 2, ++j) {
    for(int i = 1; i <= n - l; ++i) {
      v[i][j] = min(v[i][j - 1], v[i + l][j - 1]);
    }
  }
  for(int nrq = 0; nrq < m; ++nrq) {
    int x, y;
    scanf("%d%d", &x, &y);
    int k = p2[y - x + 1];
    int sol = min(v[x][k], v[y - nr2[y - x + 1] + 1][k]);
    printf("%d\n", sol);
  }
  return 0;
}