#include <iostream>
#include <fstream>
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
int arb[400000], v[100000];
void buildtree(int i, int L, int R)
{
if (L == R) {
arb[i] = v[R];
return;
}
int aux = (L + R) / 2;
buildtree (2*i+1, L, aux );
buildtree (2*i+2, aux + 1, R );
arb[i] = min( arb[2*i+1], arb[2 * i + 2] );
}
int querymin(int i, int L, int R, int x, int y)
{
if (x <= L && y >= R)
return arb[i];
int aux = L + (R - L) / 2;
if (x > aux)
return querymin(2 * i + 2, aux + 1, R, x, y);
else if (y <= aux)
return querymin(2 * i + 1, L, aux, x, y);
return min( querymin(2*i+1, L, aux, x, aux), querymin(2*i+2, aux+1, R, aux+1, y) );
}
int main()
{
int N, M, x, y;
f >> N >> M;
for (int i=1; i<=N; i++)
f >> v[i];
buildtree(1, 1, N);
for (int i = 0; i < M; i++)
{
f >> x >> y;
g << querymin(1, 1, N, x, y) << "\n";
}
return 0;
}