#include <bits/stdc++.h>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
const int N = 100001;
const int logN = 17;
int v[logN][N];
int lg[N];
int main()
{
int n,m;
fin>>n>>m;
for (int i=0; i<n; i++)
fin>>v[0][i];
int putere = 1;
for (int i=1; i<=logN; i++) {
for (int j=0; j + putere*2 - 1 < n; j++) {
v[i][j] = min(v[i-1][j], v[i-1][j+putere]);
}
putere *= 2;
}
for (int i=2; i<=n; i++) {
lg[i] = lg[i/2] + 1;
}
int x,y,dist;
for (int i=0; i<m; i++) {
fin>>x>>y;
dist = lg[y-x+1];
fout<<min(v[dist][x], v[dist][y-(int)pow(2,dist)])<<'\n';
}
fin.close();
fout.close();
return 0;
}
//#include <bits/stdc++.h>
//
//using namespace std;
//
//ifstream fin("rmq.in");
//ofstream fout("rmq.out");
//
//int arb[300005];
//
//void update(int nod, int st, int dr, int idx, int val)
//{
// if (st == dr) {
// arb[nod] = val;
// return;
// }
// int mij = st + (dr-st)/2;
//
// if (idx <= mij)
// update(2*nod, st, mij, idx, val);
// else
// update(2*nod + 1, mij+1, dr, idx, val);
//
// arb[nod] = min(arb[2*nod], arb[2*nod+1]);
//}
//
//int maxim(int nod, int st, int dr, int l, int r)
//{
// if (l <= st && dr <= r)
// return arb[nod];
//
// int mij = st + (dr-st)/2;
// int left = 1e9, right = 1e9;
//
// if (l <= mij)
// left = maxim(2*nod, st, mij, l, r);
// if (r > mij)
// right = maxim(2*nod+1, mij+1, dr, l, r);
//
// return min(left,right);
//}
//
//
//int main()
//{
// int n,m,a,b;
//
// fin>>n>>m;
// for (int i=1; i<=n; i++) {
// fin>>a;
// update(1,1,n,i,a);
// }
//
// for (int i=0; i<m; i++) {
// fin>>a>>b;
// fout<<maxim(1,1,n,a,b)<<'\n';
// }
//
// fin.close();
// fout.close();
//
// return 0;
//}