Cod sursa(job #2077792)

Utilizator firutibogdanFiruti Bogdan-Cristian firutibogdan Data 28 noiembrie 2017 17:08:15
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include <fstream>
#include <climits>
#include <math.h>

using namespace std;

int main() {
  ifstream fin("rmq.in");
  ofstream fout("rmq1.out");

  long long num, querry, root, x, y;
  long long *array;
  long long *squares;

  // Initialize arrays
  fin >> num >> querry;
  array = new long long[num + 1];
  squares = new long long[num + 1];

  // Read the input
  for (int i = 0; i < num; ++i) {
    fin >> array[i];
  }

  // Create subintervals of length sqrt(n)
  root = sqrt(num);
  for (int i = 0; i <= root; ++i) {
    squares[i] = INT_MAX;
    for (int j = root * i; j < root * (i + 1); ++j) {
      squares[i] = squares[i] < array[j] ? squares[i] : array[j];
    }
  }

  // For every querry give the answer
  for (int i = 1; i <= querry; i++) {
    long long minimum, j, ld, ls;
    minimum = INT_MAX;
    fin >> x >> y;

    // Search for the first subinterval that is inside [x, y]
    j = x / root;
    if (j * root < x) {
      j++;
    }
    j++;

    // Check if subinterval does not get over y
    ls = root * (j - 1) < y ? root * (j - 1) : y;

    // For every next subinterval check if is minimum
    for (; root * j <= y; j++) {
      minimum = minimum < squares[j - 1] ? minimum : squares[j - 1];
    }

    // Check if subinterval starts after x
    ld = root * (j - 1) > x ? root * (j - 1) : x;

    // For the remaining elemets which are not in subintervals
    // Check if they are minimum
    for (j = x; j <= ls; j++) {
      minimum = minimum < array[j - 1] ? minimum : array[j - 1];
    }
    for (j = ld; j <= y; j++) {
      minimum = minimum < array[j - 1] ? minimum : array[j - 1];
    }

    // Print the answer
    fout << minimum << "\n";
  }

  delete[] array;
  delete[] squares;
  fin.close();
  fout.close();
  return 0;
}