Pagini recente » Cod sursa (job #3225638) | Cod sursa (job #1146121) | Cod sursa (job #2682155) | Cod sursa (job #2079973) | Cod sursa (job #2665503)
#include <bits/stdc++.h>
std::vector<int> precompute_log(int n)
{
std::vector<int> computed_log(n + 1);
computed_log[1] = 0;
for (int i = 2; i <= n; i++)
computed_log[i] = computed_log[i / 2] + 1;
return computed_log;
}
std::vector<int> rmq(const std::vector<int>& input, const std::vector< std::pair<int, int> >& queries) {
int n = input.size();
int m = queries.size();
int cols = ceil(log2(n)) + 1;
std::vector< std::vector<int> > sparse_table(n, std::vector<int>(cols));
std::vector<int> computed_log = precompute_log(n);
std::vector<int> output(m);
for (int i = 0; i < n; i++)
sparse_table[i][0] = input[i];
for (int j = 1; j < cols; j++)
for (int i = 0; i + (1 << j) <= n; i++)
sparse_table[i][j] = std::min(sparse_table[i][j - 1],
sparse_table[i + (1 << (j - 1))][j - 1]);
for (int i = 0; i < m; i++) {
int left = queries[i].first, right = queries[i].second;
int j = computed_log[right - left + 1];
int minimum = std::min(sparse_table[left][j], sparse_table[right - (1 << j) + 1][j]);
output[i] = minimum;
}
return output;
}
int main() {
int n, m;
std::ios::sync_with_stdio(0), std::cin.tie(0);
std::ifstream fin("rmq.in");
std::ofstream fout("rmq.out");
fin >> n >> m;
std::vector<int> a(n);
for (int i = 0; i < n; i++) {
fin >> a[i];
}
int l, r;
std::vector< std::pair<int, int> > queries;
for (int i = 0; i < m; i++) {
fin >> l >> r;
l--; r--;
queries.push_back(std::make_pair(l, r));
}
std::vector<int> output;
output = rmq(a, queries);
for (int i = 0; i < m; i++)
fout << output[i] << "\n";
fin.close();
fout.close();
return 0;
}