#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
const int NMAX = 100005, MMAX = 1000005;
int n, m, p[NMAX], tm[4 * NMAX];
vector<int> tr[NMAX];
void build(int node, int st, int en) {
if (st == en) {
tm[node] = p[st];
return;
}
int mid = (st + en) / 2, left = node * 2, right = left + 1;
build(left, st, mid);
build(right, mid + 1, en);
tm[node] = min(tm[left], tm[right]);
}
void update(int node, int st, int en, int pos) {
if (st == en) {
tm[node] = tr[pos][0];
return;
}
int mid = (st + en) / 2, left = node * 2, right = left + 1;
if (pos <= mid) update(left, st, mid, pos);
else update(right, mid + 1, en, pos);
tm[node] = min(tm[left], tm[right]);
}
int query(int node, int st, int en, int i, int j) {
if (i > en || j < st) return 1e9;
if (st >= i && en <= j) return tm[node];
int mid = (st + en) / 2, left = node * 2, right = left + 1;
return min(query(left, st, mid, i, j), query(right, mid + 1, en, i, j));
}
int main() {
ifstream fin("rmq.in");
ofstream fout("rmq.out");
fin >> n >> m;
for (int i = 1; i <= n; ++i) fin >> p[i], tr[i].push_back(p[i]);
build(1, 1, n);
for (int i = 1; i <= m; ++i) {
int x, y; fin >> x >> y;
fout << query(1, 1, n, x, y) << "\n";
}
return 0;
}