Cod sursa(job #2499902)

Utilizator vlad.proteasaVlad Proteasa vlad.proteasa Data 26 noiembrie 2019 22:18:02
Problema Range minimum query Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <bits/stdc++.h>

using namespace std;

#define MAXN 100000



int *preprocess (int *array, int n) {
  int *aux, m = (int) sqrt(n);
  if (m * m != n) {
    m++;
  }
  aux = new int [m]();
  for (int i = 0; i < m; ++i) {
    aux[i] = array[i * m];
    for (int j = 1; j < m && i * m + j < n; ++j) {
      if (aux[i] > array[i * m + j]) {
        aux[i] = array[i * m + j];
      }
    }
  }
  return aux;
}

int rmq(int *array, int *v, int x, int y, int n) {
  int *aux, m = (int) sqrt(n), min, l, r;
  if (m * m != n) {
    m++;
  }
  min = array[x];
  while (x <= y && x % m != 0) {
    if (min > array[x]) {
      min = array[x];
    }
    x++;
  }
  while (x + m < y) {
    if (min > v[x / m]) {
      min = v[x / m];
    }
    x += m;
  }
  while (x <= y) {
    if (min > array[x]) {
      min = array[x];
    }
    x++;
  }
  return min;
}

int main(int argc, const char * argv[]) {

  ifstream in;
  ofstream out;
  in.open("rmq.in");
  out.open("rmq.out");
  int N, M, *array, x, y, *p;
  in >> N >> M;
  array = new int [N];
  for(int i = 0; i < N; ++i) {
    in >> array[i];
  }
  p = preprocess(array, N);
  for (int i = 0; i < M; ++i) {
     in >> x >> y;
     out << rmq(array, p, x - 1, y - 1, N) << '\n';
  }
  in.close();
  out.close();
  return 0;
}