Pagini recente » Cod sursa (job #549040) | Cod sursa (job #1825543) | Cod sursa (job #1174546) | Cod sursa (job #671256) | Cod sursa (job #2266890)
#include <fstream>
#include <vector>
using namespace std;
int FindMin(const vector<vector<int>> &mins, int left, int right)
{
auto exp = 0;
while (left + (1 << exp) <= right) {
exp += 1;
}
exp -= 1;
exp = max(exp, 0);
auto res = mins[left][exp];
res = min(res, mins[right - (1 << exp) + 1][exp]);
return res;
}
int main()
{
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int n, queries;
fin >> n >> queries;
vector<vector<int>> mins(n);
for (int i = 0; i < n; i += 1) {
int num;
fin >> num;
mins[i].push_back(num);
}
auto exp = 0;
while ((1 << (exp + 1)) <= n) {
for (auto i = 0; i + (1 << (exp + 1)) <= n; i += 1) {
auto min_num = min(mins[i][exp], mins[i + (1 << exp)][exp]);
mins[i].push_back(min_num);
}
exp += 1;
}
for (auto i = 0; i < queries; i += 1) {
int left, right;
fin >> left >> right;
auto res = FindMin(mins, left - 1, right - 1);
fout << res << "\n";
}
return 0;
}