#include <bits/stdc++.h>
using namespace std;
ifstream in("rmq.in");
ofstream out("rmq.out");
int const INF = 1000000000;
int const NMAX = 100000;
int n, m;
int seg[1 + 4*NMAX];
int query(int node, int left, int right, int from, int to) {
int mid = (left+right)/2;
if(left == from && right == to) {
return seg[node];
} else {
int n1, n2;
n1 = n2 = INF;
if(from <= mid) {
n1 = query(2*node, left, mid, from, min(mid, to));
}
if(mid+1 <= to) {
n2 = query(2*node + 1, mid+1, right, max(from, mid+1), to);
}
return min(n1, n2);
}
}
void update(int node, int left, int right, int pos, int val) {
int mid = (left+right)/2;
if(left == right) {
seg[node] = val;
assert(left == pos);
} else {
if(pos <= mid) {
update(2*node, left, mid, pos, val);
} else {
update(2*node + 1, mid+1, right, pos, val);
}
seg[node] = min(seg[2*node], seg[2*node + 1]);
}
}
int main() {
in >> n >> m;
for(int i = 1; i <= n; i++) {
int x;
in >> x;
update(1, 1, n, i, x);
}
for(int i = 1; i <= m; i++) {
int le, ri;
in >> le >> ri;
out << query(1, 1, n, le, ri) << "\n";
}
}