#include <cstdio>
#include <algorithm>
using namespace std;
struct node
{
node *st, *dr, *par;
int ist, idr, m;
node(int x = 0)
{
m = x;
}
}*leaf[100010];
int n, m;
node *root;
void read()
{
int aux, i;
scanf("%d%d", &n, &m);
for(i = 0; i < n; i++)
{
scanf("%d", &aux);
leaf[i] = new node(aux);
leaf[i] -> ist = leaf[i] -> idr = i;
}
}
int create(node * &p, int st, int dr, node *par = NULL)
{
if(st == dr)
{
p = leaf[st];
p -> par = par;
return p -> m;
}
p = new node;
p -> ist = st;
p -> idr = dr;
p -> par = par;
int mij = (st+dr)/2;
p -> m = min(create(p->st, st, mij, p), create(p->dr, mij+1, dr, p));
return p -> m;
}
int getmin(node *p, int st, int dr)
{
if(p -> idr < st || p -> ist > dr)
return INFINITY;
if(p -> ist >=st && p -> idr <= dr)
return p -> m;
return min(getmin(p -> st, st, dr), getmin(p->dr, st, dr));
}
void solve()
{
int i, x, y, aux;
for(i = 0; i< m; i++)
{
scanf("%d%d", &x, &y);
aux = getmin(root, x-1, y-1);
printf("%d\n", aux);
}
}
int main()
{
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
read();
create(root, 0, n-1);
solve();
return 0;
}