#include <bits/stdc++.h>
void buildTree(int node, int left, int right, std::vector<int>& arb_int, const std::vector<int>& input) {
if (left == right) {
arb_int[node] = input[left];
} else {
int middle = left + (right - left) / 2;
buildTree(2 * node, left, middle, arb_int, input);
buildTree(2 * node + 1, middle + 1, right, arb_int, input);
arb_int[node] = std::min(arb_int[2 * node], arb_int[2 * node + 1]);
}
}
void answerQuery(int node, int left, int right, std::vector<int>& arb_int, std::pair<int, int> query, int& ans) {
if (query.first <= left && right <= query.second) {
ans = std::min(ans, arb_int[node]);
return;
}
int middle = left + (right - left) / 2;
if (query.first <= middle)
answerQuery(2 * node, left, middle, arb_int, query, ans);
if (query.second > middle)
answerQuery(2 * node + 1, middle + 1, right, arb_int, query, ans);
}
std::vector<int> rmq(const std::vector<int>& input, const std::vector< std::pair<int, int> >& queries) {
int n = input.size();
int height = (int)(ceil(log2(n)));
int tree_size = 2*(int)pow(2, height) - 1;
std::vector<int> output;
std::vector<int> arb_int(tree_size, INT_MAX);
buildTree(1, 0, n - 1, arb_int, input);
for (auto query : queries) {
int answer = INT_MAX;
answerQuery(1, 0, n - 1, arb_int, query, answer);
output.push_back(answer);
}
return output;
}
int main() {
int n, m;
std::ios::sync_with_stdio(0), std::cin.tie(0);
std::ifstream fin("rmq.in");
std::ofstream fout("rmq.out");
fin >> n >> m;
std::vector<int> a(n);
for (int i = 0; i < n; i++) {
fin >> a[i];
}
int l, r;
std::vector< std::pair<int, int> > queries;
for (int i = 0; i < m; i++) {
fin >> l >> r;
l--; r--;
queries.push_back(std::make_pair(l, r));
}
std::vector<int> output;
output = rmq(a, queries);
for (int i = 0; i < m; i++)
fout << output[i] << "\n";
fin.close();
fout.close();
return 0;
}