#include <cstdint>
#include <cstdio>
#include <iostream>
#include <vector>
#include <bit>
class MinQueryRangeSolver {
public:
MinQueryRangeSolver(std::vector<int> values)
: min_on_range(std::bit_width(values.size() + 1),
std::vector<int>(values.size())) {
const auto n = static_cast<int>(values.size());
min_on_range[0] = values;
for (int l = 1; (1 << l) <= n; l++) {
for (int i = 0; i < n - (1 << l) + 1; i++) {
min_on_range[l][i] = std::min(min_on_range[l - 1][i],
min_on_range[l - 1][i + (1 << (l - 1))]);
}
}
}
int query(int l, int r) const {
const auto level = std::bit_width(
static_cast<uint32_t>(r - l + 1)) - 1; // So this is log(r - l + 1).
return std::min(min_on_range[level][l],
min_on_range[level][r - (1 << level) + 1]);
}
private:
std::vector<std::vector<int>> min_on_range;
};
int main() {
std::freopen("rmq.in", "r", stdin);
std::freopen("rmq.out", "w", stdout);
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int n, m;
std::cin >> n >> m;
std::vector<int> v(n);
for (int& x : v) {
std::cin >> x;
}
MinQueryRangeSolver RMQ{std::move(v)};
for (int i = 0; i < m; i++) {
int l, r;
std::cin >> l >> r;
std::cout << RMQ.query(l - 1, r - 1) << "\n";
}
return 0;
}