#include <fstream>
using namespace std;
ifstream cin ("rmq.in");
ofstream cout ("rmq.out");
const int inf=100000000-1;
int v[100005];
struct copac
{
int minim;
};
copac tree[400005];
void formare (int nod,int st,int dr)
{
if(st==dr)
{
//tree[nod].suma=v[st];
//tree[nod].maxim=v[st];
tree[nod].minim=v[st];
}
else
{
int mij=(st+dr)/2;
formare(nod*2,st,mij);
formare(nod*2+1,mij+1,dr);
//tree[nod].suma=tree[nod*2].suma+tree[nod*2+1].suma;
//tree[nod].maxim=max(tree[nod*2].maxim,tree[nod*2+1].maxim);
tree[nod].minim=min(tree[nod*2].minim,tree[nod*2+1].minim);
}
}
int afis (int nod,int st,int dr,int poz1,int poz2)
{
if(st>=poz1 && dr<=poz2)
{
return tree[nod].minim;
}
else
{
int stanga=inf;
int dreapta=inf;
int mij=(st+dr)/2;
if(mij<poz2)
{
dreapta=afis(nod*2+1,mij+1,dr,poz1,poz2);
}
if(mij>=poz1)
{
stanga=afis(nod*2,st,mij,poz1,poz2);
}
return min(stanga,dreapta);
}
}
void update (int nod,int st,int dr,int poz1,int val)
{
if(st==dr)
{
//tree[nod].suma=val;
//tree[nod].maxim=val;
tree[nod].minim=val;
return ;
}
int mij=(st+dr)/2;
if(poz1>mij)
{
update(nod*2+1,mij+1,dr,poz1,val);
}
else
{
update(nod*2,st,mij,poz1,val);
}
//tree[nod].suma=tree[nod*2].suma+tree[nod*2+1].suma;
//tree[nod].maxim=max(tree[nod*2].maxim,tree[nod*2+1].maxim);
tree[nod].minim=min(tree[nod*2].minim,tree[nod*2+1].minim);
}
int main()
{
int n,i,j,k,m,st,dr,suma,val,x;
cin>>n>>m;
for(i=1; i<=n; i++)
{
cin>>v[i];
}
formare(1,1,n);
for(i=1; i<=m; i++)
{
cin>>st>>dr;
suma=afis(1,1,n,st,dr);
cout<<suma<<'\n';
}
return 0;
}