#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
#define NMAX 100025
#define MMAX 1000025
#define INFINIT 1000000000
typedef pair<int, int>ii;
int n, m, v[NMAX], seg[NMAX*2 - 1 + 5];
ii h[NMAX*2 - 1 + 5];
int overlap(ii a, ii b){
if(b.first <= a.first && b.second >= a.second)
return 1;
if(b.second < a.first || a.second < b.first)
return 0;
return 2;
}
void buildTree(int left, int right, int nod){
if(left == right){
seg[nod] = v[left];
h[nod].first = h[nod].second = right;
return;
}
int mid = (left + right)/2;
buildTree(left, mid, nod*2);
buildTree(mid + 1, right, nod*2 + 1);
seg[nod] = min(seg[nod*2], seg[nod*2 + 1]);
h[nod].first = h[nod*2].first;
h[nod].second = h[nod*2 + 1].second;
}
int rmq(int left, int right, int nod){
int aux = overlap(h[nod], ii(left, right));
if(aux == 0){
///no overlap
return INFINIT;
}else
if(aux == 1){
///total overlap
return seg[nod];
}else
if(aux == 2){
///partial overlap
int l = rmq(left, right, nod*2);
int r = rmq(left, right, nod*2 + 1);
return min(l, r);
}
}
int main(){
int i, x, y, tx, ty;
FILE *fin, *fout;
fin = fopen("rmq.in", "r");
fout = fopen("rmq.out", "w");
fscanf(fin, "%d %d", &n, &m);
for(i=1; i<=n; i++)
fscanf(fin, "%d", &v[i]);
buildTree(1, n, 1);
for(i=1; i<=m; i++){
fscanf(fin, "%d %d", &x, &y);
fprintf(fout, "%d\n", rmq(x, y, 1));
}
fclose(fin);
fclose(fout);
return 0;
}