Pagini recente » Cod sursa (job #2819645) | Cod sursa (job #449436) | Cod sursa (job #3249544) | Cod sursa (job #1570461) | Cod sursa (job #2077792)
#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;
}