#include <iostream>
#include <fstream>
std::ifstream f("rmq.in");
std::ofstream g("rmq.out");
int n, m, x, y, t, minim, start, finish, st, dr, tree[400001];
void update(int nod, int poz, int val, int st, int dr){
if(st==dr){ tree[nod] = val; return; }
int mid = (st+dr)/2;
if( poz<=mid ) update(2*nod, poz, val, st, mid);
if( poz>mid ) update(2*nod+1, poz, val, mid+1, dr);
if( tree[2*nod] <= tree[2*nod+1] ) tree[nod] = tree[2*nod];
else tree[nod] = tree[2*nod+1];
}
void query(int nod, int &minim, int start, int finish, int st, int dr){
if( start <= st && dr<=finish ){if( minim>tree[nod] ) minim=tree[nod]; return;}
int mid = (st+dr)/2;
if( start<=mid ) query(2*nod, minim, start, finish, st, mid);
if( mid<finish ) query(2*nod+1, minim, start, finish, mid+1, dr);
}
int main() {
f>>n>>m;
for(int i=1 ; i<=n ; i++){
f>>x;
update(1, i, x, 1, n);
}
for(int i=1 ; i<=m ; i++){
f>>x>>y;
minim = 100001;
start = x;
finish = y;
query(1, minim, start, finish, 1, n);
//std::cout<<minim<<"\n";
g<<minim<<"\n";
}
return 0;
}