#include <stdio.h>
#include <algorithm>
using namespace std;
#define NMAX 100002
#define INF 0x3f3f3f3f
long int aint[NMAX * 3 + 1];
long int rez;
void update(long int nod, long int st, long int dr, long int poz, long int val) {
if (st == dr) {
aint[nod] = val;
} else {
long int mid = (st + dr) / 2;
if (poz <= mid){
update(2 * nod, st, mid, poz, val);
} else {
update(2 * nod + 1, mid + 1, dr, poz, val);
}
aint[nod] = min(aint[2 * nod], aint[2 * nod + 1]);
}
}
void query(long int nod, long int st, long int dr, long int a, long int b) {
if (a <= st && dr <= b){
rez = min(rez, aint[nod]);
} else {
long int mid = (st + dr) / 2;
if (a <= mid) {
query(2 * nod, st, mid, a, b);
}
if (b > mid) {
query(2 * nod + 1, mid + 1, dr, a, b);
}
}
}
int main() {
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
int N, M;
long int x, y;
scanf("%d %d", &N, &M);
for (int i = 1 ; i <= N ; i++) {
scanf("%ld", &x);
update(1, 1, N, i, x);
}
for (int i = 1 ; i <= M ; i++) {
scanf("%ld %ld", &x, &y);
rez = INF;
query(1, 1, N, x, y);
printf("%ld\n", rez);
}
return 0;
}