#include <iostream>
#include <fstream>
#define NMAX 100010
#define MIN(a,b) ((a<b)?a:b)
using namespace std;
ifstream f ("rmq.in");
ofstream g ("rmq.out");
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()
{
long N, M, i, j, x, y, v[NMAX], m[NMAX];
f>>N>>M;
for(i=0;i<N;i++) f>>v[i];
rmq_initialize(1, 0, N, m, v);
for(j=1;j<=M;j++)
{
f>>x>>y;
i = rmq_query(1, 0, N, m, v, x-1, y-1);
if (i != -1) g<<v[i]<<"\n";
else g<<-1<<"\n";
}
f.close();
g.close();
return 0;
}