#include <bits/stdc++.h>
#define dim 100005
using namespace std;
int a[20][dim],lg[dim];
int main()
{
ifstream in("rmq.in");
ofstream out("rmq.out");
int n,m,i,j,k,x,y;
in>>n>>m;
//construim prima linie a matricei, care va retine minimele intervalelor de 2^0, in fond vectorul dat
for(i=1;i<=n;++i)
in>>a[0][i];
//construiesc restul de linii a matricei cu semnificatia ca linia i retine minimele intervalelor de 2^i elemente,
//mai precis a[i][j] retine minimul de la j pana la j+2^i-1
//liniile sunt din ce in ce mai mici si anume retin n-2^i+1 elemente
//descompunem intervalul j, j+2^i-1 in 2 intervale, scriindu l pe 2^i ca 2^(i-1) + 2^(i-1)
//obtinem j,j+2^(i-1)-1, adica a[i-1][j] si j+2^(i-1), j+2^i-1, adica a[i-1][j+2^(i-1)]
//prin urmare a[i][j]=min(a[i-1][j], a[i-1][j+2^(i-1)])
for(i=1;(1<<i)<=n;++i)
for(j=1;j<=n;++j)
a[i][j]=min(a[i-1][j], a[i-1][j+(1<<(i-1))]);
//ca sa aflam minumul unui interval (x,y), gasim cea mai apropiata putere a lui de 2 de y-x+1 si pe acea linie vom cauta
//sa zicem ca va fi linia k. Minimul nostru va fi compus din minimele x,x+2^k-1 si y-2^k+1, y intervale care au intersectie
//ca sa nu calculam de fiecare data puterea lui 2, adica logaritmul, vom pastra log2 de toate numerele pana la n intr un vector
//precalculat
lg[1]=0;
for(i=2;i<=n;++i)
lg[i]=lg[i>>1]+1;
//realizam interogarile in O(1)
while(m)
{
in>>x>>y;
//vedem daca sunt in ordine, daca nu swapam
if(x>y)
swap(x,y);
k=lg[y-x+1];
out<<min(a[k][x], a[k][y-(1<<k)+1])<<"\n";
--m;
}
return 0;
}