Pagini recente » Cod sursa (job #1597856) | Rating Nita Andrei (andrei1058) | Istoria paginii utilizator/augustinu04 | Profil M@2Te4i | Cod sursa (job #2247208)
#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;
}