Pagini recente » Cod sursa (job #2644132) | Cod sursa (job #1229687) | Cod sursa (job #714701) | Cod sursa (job #1421928) | Cod sursa (job #2796365)
#include <fstream>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#define Forward(x) std::forward<decltype(x)>(x)
template<typename T>
class SqrtDecomp {
public:
SqrtDecomp(auto&& values) : values(Forward(values)) {
n = this->values.size();
BUCK = sqrt(n);
buildBuckets();
}
SqrtDecomp() = delete;
T query(int l, int r) const {
T answer = INF;
while (l % BUCK != 0 && l <= r) {
answer = std::min(answer, values[l]);
l++;
}
while (r % BUCK != BUCK - 1 && l <= r) {
answer = std::min(answer, values[r]);
r--;
}
while (l <= r) {
answer = std::min(answer, buckets[getBuckIdx(l)]);
l += BUCK;
}
return answer;
}
private:
int getBuckIdx(int pos) const {
return pos / BUCK;
}
void buildBuckets() {
buckets.resize(getBuckIdx(n - 1) + 1, INF);
for (std::size_t i = 0; i < n; i++) {
int idx = getBuckIdx(i);
buckets[idx] = std::min(buckets[idx], values[i]);
}
}
private:
std::size_t n;
std::vector<T> values;
std::vector<T> buckets;
int BUCK;
const T INF = std::numeric_limits<T>::max();
};
int main() {
std::ifstream fin("rmq.in");
std::ofstream fout("rmq.out");
std::ios::sync_with_stdio(false);
fin.tie(0), fout.tie(0);
int n, m;
fin >> n >> m;
std::vector<int> values(n);
for (auto& itr : values) {
fin >> itr;
}
SqrtDecomp<int> decomp(std::move(values));
while (m--) {
int l, r;
fin >> l >> r;
l--, r--;
fout << decomp.query(l, r) << "\n";
}
return 0;
}