#include <stdio.h>
#include <fstream>
#include <assert.h>
using namespace std;
int n, m, MinArb[4*100001+66], start, finish, Val, Pos, minim;
void Update(int nod, int left, int right) {
if (left == right) {
MinArb[nod] = Val;
return;
}
int div = (left + right) / 2;
if (Pos <= div)
Update(2 * nod, left, div);
else
Update(2 * nod + 1, div + 1, right);
if(MinArb[2 * nod] < MinArb[2 * nod + 1])
MinArb[nod] = MinArb[2 * nod];
else MinArb[nod] = MinArb[2 * nod + 1];
}
void Query(int nod, int left, int right) {
if (start <= left && right <= finish) {
if (minim > MinArb[nod])
minim = MinArb[nod];
return;
}
int div = (left + right) / 2;
if ( start <= div )
Query(2 * nod, left, div);
if ( div < finish )
Query(2 * nod + 1, div + 1, right);
}
int main()
{
int x, a, b;
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%d", &x);
Pos = i, Val = x;
Update(1, 1, n);
}
for (int i = 1; i <= m; i++) {
scanf("%d%d", &a, &b);
minim = 100001;
start = a, finish = b;
Query(1,1,n);
printf("%d\n", minim);
}
return 0;
}