Pagini recente » Cod sursa (job #449296) | Cod sursa (job #190500) | Cod sursa (job #1150785) | Cod sursa (job #2156234) | Cod sursa (job #1756557)
#include <iostream>
#include <cstdio>
#include <vector>
#include <stack>
#include <cassert>
#include <algorithm>
using namespace std;
class Rmq {
public:
Rmq(const vector<int> &nums) {
int k = int(log(nums.size()) / log(2));
m_.resize(nums.size(), vector<int>(k + 1, 0));
for (int i = 0; i < nums.size(); ++i) {
m_[i][0] = nums[i];
}
}
void Calculate() {
// Calculate segments of length 2^k
for (int k = 1; k < m_[0].size(); ++k) {
for (int i = 0; i + 1 << (k - 1) < m_.size(); ++i) {
m_[i][k] = min(m_[i][k - 1], m_[i + (1 << (k - 1))][k - 1]);
}
}
}
int Query(int left, int right) {
if (left > right) {
swap(left, right);
}
int k = int(log(right - left + 1) / log(2));
return min(m_[left][k], m_[right - (1 << k) + 1][k]);
}
void Debug() {
for (int i = 0; i < m_.size(); ++i, printf("\n")) {
for (int j = 0; j < m_[i].size(); ++j) {
printf("%d ", m_[i][j]);
}
}
}
private:
vector<vector<int>> m_;
};
int main() {
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
int n, m, x, y;
vector<int> nums;
scanf("%d %d", &n, &m);
nums.resize(n);
for (int i = 0; i < n; ++i) {
scanf("%d", &nums[i]);
}
Rmq *instance = new Rmq(nums);
instance->Calculate();
for (int i = 0; i < m; ++i) {
scanf("%d %d", &x, &y);
printf("%d\n", instance->Query(x-1, y-1));
}
//instance->Debug();
return 0;
}