Pagini recente » Cod sursa (job #1358450) | Cod sursa (job #329763) | Cod sursa (job #990886) | Cod sursa (job #680400) | Cod sursa (job #2462562)
#include <fstream>
#include <vector>
using namespace std;
class Rmq
{
public:
Rmq(const vector<int> &vec);
int Min(int left, int right) const;
private:
vector<vector<int>> mins_;
};
Rmq::Rmq(const vector<int> &vec)
{
mins_.resize(vec.size());
for (int i = 0; i < (int)vec.size(); i += 1) {
mins_[i].push_back(vec[i]);
int index = 0;
int prev = i - (1 << index);
while (index < (int)mins_[prev].size()) {
mins_[i].push_back(min(mins_[i].back(), mins_[prev][index]));
index += 1;
prev = i - (1 << index);
}
}
}
int Rmq::Min(int left, int right) const
{
int index = 0;
while ((1 << (index + 1)) <= right - left + 1) {
index += 1;
}
int res = min(mins_[right][index], mins_[left + (1 << index) - 1][index]);
return res;
}
int main()
{
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int n, tests;
fin >> n >> tests;
vector<int> vec(n);
for (auto &num : vec) {
fin >> num;
}
Rmq rmq(vec);
for (int i = 0; i < tests; i += 1) {
int left, right;
fin >> left >> right;
fout << rmq.Min(left - 1, right - 1) << "\n";
}
return 0;
}