Pagini recente » Istoria paginii runda/veryeasy | Cod sursa (job #2517174) | Cod sursa (job #1428242) | Cod sursa (job #21632) | Cod sursa (job #2665184)
#include <bits/stdc++.h>
std::vector<int> rmq(const std::vector<int>& input, const std::vector< std::pair<int, int> >& queries) {
int n = input.size();
std::vector<int> output;
int block_size = sqrt(n);
std::vector<int> blocks(block_size + 1, INT_MAX);
int crt_block = -1;
for (int i = 0; i < n; i++) {
if (i % block_size == 0) {
crt_block++;
}
blocks[crt_block] = std::min(blocks[crt_block], input[i]);
}
int left, right, crt_pos, ans;
for (auto query: queries) {
left = query.first;
right = query.second;
crt_pos = left;
ans = INT_MAX;
while (crt_pos < right && (crt_pos % block_size) != 0) {
ans = std::min(ans, input[crt_pos]);
crt_pos++;
}
while (crt_pos + block_size <= right) {
ans = std::min(ans, blocks[crt_pos / block_size]);
crt_pos += block_size;
}
while (crt_pos <= right) {
ans = std::min(ans, input[crt_pos]);
crt_pos++;
}
output.push_back(ans);
}
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;
}