#include <bits/stdc++.h>
using namespace std;
const int NMAX=2e5;
int A[NMAX], Arbore[5*NMAX], N, M, i, x, y, X;
void Update (int nod, int a, int b, int poz, int val)
{
if(a==b)
{
Arbore[nod]=val;
return;
}
int mij=(a+b)/2;
if(poz<=mij)
Update(2*nod, a, mij, poz, val);
if(poz>mij)
Update(2*nod+1, mij+1, b, poz, val);
Arbore[nod]=min(Arbore[2*nod], Arbore[2*nod+1]);
}
int Query (int nod, int a, int b, int qa, int qb)
{
if(qa<=a && b<=qb)
return Arbore[nod];
int mij=(a+b)/2;
int ans1=INT_MAX, ans2=INT_MAX;
if(qa<=mij)
ans1=Query(2*nod, a, mij, qa, qb);
if(qb>mij)
ans2=Query(2*nod+1, mij+1, b, qa, qb);
return min(ans1, ans2);
}
int main()
{
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
scanf("%d%d", &N, &M);
for(i=1; i<=N; i++)
{
scanf("%d", &X);
Update(1, 1, N, i, X);
}
for(i=1; i<=M; i++)
{
scanf("%d%d", &x, &y);
printf("%d\n", Query(1, 1, N, x, y));
}
return 0;
}