#include <iostream>
#include <vector>
#include <climits>
class AInt {
private:
std::vector<int> tree;
int n;
void init(const std::vector<int>& arr, int st, int dr, int pos) {
if (st == dr) {
tree[pos] = arr[st];
return;
}
int mid = st + (dr - st) / 2;
init(arr, st, mid, 2 * pos + 1);
init(arr, mid + 1, dr, 2 * (pos + 1));
tree[pos] = std::min(tree[2 * pos + 1], tree[2 * (pos + 1)]);
}
int getMinRecursive(int ql, int qr, int st, int dr, int pos) {
if (ql <= st && qr >= dr)
return tree[pos];
if (ql > dr || qr < st)
return INT_MAX;
int mid = st + (dr - st) / 2;
return std::min(getMinRecursive(ql, qr, st, mid, 2 * pos + 1), getMinRecursive(ql, qr, mid + 1, dr, 2 * (pos + 1)));
}
void update(int x, int val, int st, int dr, int pos) {
if (x < st || x > dr)
return;
if (st == dr) {
tree[pos] = val;
return;
}
int mid = st + (dr - st) / 2;
update(x, val, st, mid, 2 * pos + 1);
update(x, val, mid + 1, dr, 2 * pos + 2);
tree[pos] = std::min(tree[2 * pos + 1], tree[2 * (pos + 1)]);
}
public:
AInt(const std::vector<int>& arr) {
n = arr.size();
tree.resize(4 * n);
init(arr, 0, n - 1, 0);
}
void updateValue(int x, int val) {
update(x, val, 0, n - 1, 0);
}
int getMin(int ql, int qr) {
return getMinRecursive(ql, qr, 0, n - 1, 0);
}
};
int main() {
std::vector<int> arr;
int n, m, x, y;
std::cin >> n >> m;
for (int i = 0; i < n; i++) {
std::cin >> x;
arr.push_back(x);
}
AInt aint(arr);
for (int i = 0; i < m; i++) {
std::cin >> x >> y;
std::cout << aint.getMin(x - 1, y - 1) << "\n";
}
return 0;
}