#include <iostream>
#include <fstream>
#include <math.h>
#define NMAX 100010
#define MIN(a,b) ((a<b)?a:b)
using namespace std;
void rmq_initialize(long node, int lo, int hi, long m[], long v[]){ // initialize the segment tree
if (lo >= hi) m[node] = lo;
else{
rmq_initialize(node * 2, lo, (lo+hi) / 2, m, v);
rmq_initialize(node * 2+1, (lo+hi) / 2 + 1, hi, m, v);
if (v[m[2 * node]] <= v[m[2 * node + 1]])
m[node] = m[2 * node];
else
m[node] = m[2 * node + 1];
}
}
long rmq_query(long node, int lo, int hi, long m[], long v[], int i, int j){
int p1, p2;
if (i > hi || j < lo) return -1;
if (lo >= i && hi <= j) return m[node];
p1 = rmq_query(2 * node, lo, (lo+hi) / 2, m, v, i, j);
p2 = rmq_query(2 * node+1, (lo+hi) / 2 + 1, hi, m, v, i, j);
if (p1 == -1) return /*m[node] = */p2;
if (p2 == -1) return /*m[node] = */p1;
if (v[p1] <= v[p2]) return /*m[node] = */p1;
return /*m[node] = */p2;
}
int main()
{
ifstream f ("rmq.in");
ofstream g ("rmq.out");
long N, M, i, j, x, y, l, v[NMAX];
f>>N>>M;
for(i=0;i<N;i++) f>>v[i];
l = 2 * pow(2, log2(N) + 1);
long m[l];
for (i = 1; i < l; i++) m[l] = -1;
rmq_initialize(1, 0, N-1, m, v);
for(j=1;j<=M;j++)
{
f>>x>>y;
g<<v[rmq_query(1, 0, N-1, m, v, x-1, y-1)]<<"\n";
}
f.close();
g.close();
return 0;
}