#include <fstream>
using namespace std;
#define NMAX 100001
ifstream cin("rmq.in");
ofstream cout("rmq.out");
int n, m;
int tree[4 * NMAX];
void init(int node, int left, int right, int pos, int val) {
if (left == right) {
tree[node] = val;
return;
}
int mid = (left + right) / 2;
if (pos <= mid)
init(2 * node, left, mid, pos, val);
else init(2 * node + 1, mid + 1, right, pos, val);
tree[node] = min(tree[2 * node], tree[2 * node + 1]);
}
void query(int node, int left, int right, int start, int finish, int& minimum) {
if (left > finish || right < start)
return;
if (start <= left && right <= finish) {
if (tree[node] < minimum)
minimum = tree[node];
return;
}
int mid = (left + right) / 2;
if (start <= mid)
query(2 * node, left, mid, start, finish, minimum);
if (mid < finish)
query(2 * node + 1, mid + 1, right, start, finish, minimum);
}
int main() {
cin >> n >> m;
for (int i = 1, x; i <= n; ++i) {
cin >> x;
init(1, 1, n, i, x);
}
for (int i = 1, a, b; i <= m; ++i) {
cin >> a >> b;
int minimum = 0x3f3f3f;
query(1, 1, n, a, b, minimum);
cout << minimum << "\n";
}
cin.close();
cout.close();
return 0;
}