Cod sursa(job #2077756)

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

using namespace std;

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

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

  fin >> num >> querry;
  array = new long long[num];
  squares = new long long[num];

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

  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 (int i = 1; i <= querry; i++)
    {
        long long mn, j, ld, ls;
        mn = INT_MAX;
        fin >> x >> y;
        //for (j = 1; root * j < x; j++);
        j = x / root;
        j++;
        ls = min(root * (j - 1), y);
        for (; root * j <= y; j++)
            mn = min(mn, squares[j - 1]);
        ld = max(root * (j - 1), x);

        for (j = x; j <= ls; j++)
            mn = min(mn, array[j - 1]);
        for (j = ld; j <= y; j++)
            mn = min(mn, array[j - 1]);
        fout << mn << "\n";
    }

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