Mai intai trebuie sa te autentifici.
Cod sursa(job #3357800)
| Utilizator | Data | 13 iunie 2026 15:03:11 | |
|---|---|---|---|
| Problema | Range minimum query | Scor | 100 |
| Compilator | cpp-64 | Status | done |
| Runda | Arhiva educationala | Marime | 1.58 kb |
#include <iostream>
#include <fstream>
#include <climits>
#include <cmath>
#include <algorithm>
int main() {
std::ifstream input("rmq.in");
std::ofstream output("rmq.out");
int n, m;
input >> n >> m;
int* a = new int[n];
for (int i = 0; i < n; ++i) {
input >> a[i];
}
int blockSize = static_cast<int>(std::sqrt(n));
if (blockSize * blockSize < n) blockSize++;
int numBlocks = (n + blockSize - 1) / blockSize;
int* blockMin = new int[numBlocks];
for (int i = 0; i < numBlocks; ++i) {
blockMin[i] = INT_MAX;
int start = i * blockSize;
int end = std::min(start + blockSize, n);
for (int j = start; j < end; ++j) {
blockMin[i] = std::min(blockMin[i], a[j]);
}
}
while (m--) {
int x, y;
input >> x >> y;
x--; y--;
int startBlock = x / blockSize;
int endBlock = y / blockSize;
int minVal = INT_MAX;
if (startBlock == endBlock) {
for (int i = x; i <= y; ++i) {
minVal = std::min(minVal, a[i]);
}
} else {
for (int i = x; i < (startBlock + 1) * blockSize; ++i) {
minVal = std::min(minVal, a[i]);
}
for (int i = startBlock + 1; i < endBlock; ++i) {
minVal = std::min(minVal, blockMin[i]);
}
for (int i = endBlock * blockSize; i <= y; ++i) {
minVal = std::min(minVal, a[i]);
}
}
output << minVal << '\n';
}
delete[] a;
delete[] blockMin;
return 0;
}