#include <iostream>
#include <fstream>
int vec[4000001];
void arbore (int nod, int l, int r, int poz, int x )
{
if(l == r)
{
vec[nod]=x;
return;
}
int m =(l+r)>>1;
if (poz <= m)
arbore(2*nod, l, m, poz, x);
else
arbore (2*nod+1, m+1, r, poz, x);
vec[nod] = std::min(vec[2*nod], vec[2*nod+1]);
}
int min(int nod, int left, int right, int stanga, int dreapta)
{
if( left >= stanga && right <= dreapta) return vec[nod];
int m=(left + right )/2;
int nr1=100001, nr2= 100001;
if (stanga <= m)
nr1=min(2*nod, left , m, stanga, dreapta);
if (m+1 <= dreapta)
nr2=min(2*nod+1, m+1, right, stanga, dreapta);
if(nr1 <= nr2)
return nr1;
return nr2;
}
int main()
{
int n, m;
std::ifstream f("rmq.in");
std::ofstream g("rmq.out");
f>>n>>m;
for( int i=1; i<=n; i++)
{
int a;
f>>a;
arbore(1, 1, n, i, a);
}
for ( int i=1; i<=m; i++)
{
int a, b;
f>>a>>b;
g<<min(1, 1, n, a, b)<<"\n";
}
return 0;
}