#include<cstdio>
#include<iostream>
#include<algorithm>
#include<stack>
using namespace std;
int a[40005];
int mi[40005];
int ma[40005];
inline int lchild(int cnt){
return (cnt << 1);
}
inline int rchild(int cnt){
return (cnt << 1) + 1;
}
void push_up(int p){
mi[p] = min(mi[lchild(p)], ma[rchild(p)]);
ma[p] = max(mi[lchild(p)], ma[rchild(p)]);
}
void build_tree(int p, long long l, long long r){
if(l == r){
mi[p] = a[l];
ma[p] = a[l];
return;
}
int mid = (l + r) >> 1;
build_tree(lchild(p), l, mid);
build_tree(rchild(p), mid + 1, r);
push_up(p);
}
int que_min(int p, int l, int r, int ql, int qr){
if(l <= ql && r <= qr){
return mi[p];
}
int mid = (l + r) / 2;
int ans = 1e9;
if(ql <= mid){
ans = min(ans, que_min(lchild(p), l, mid, ql, qr));
}
if(qr > mid){
ans = min(ans, que_min(rchild(p), mid + 1, r, ql, qr));
}
return ans;
}
/*int que_max(int p, int l, int r, int ql, int qr){
if(l <= ql && r <= qr){
return ma[p];
}
int mid = (l + r) / 2;
int ans = -1e9;
if(ql <= mid){
ans = max(ans, que_min(lchild(p), l, mid, ql, qr));
}
if(qr > mid){
ans = max(ans, que_min(rchild(p), r, mid, ql, qr));
}
return ans;
}*/
int main(){
int n, m;
cin >> n >> m;
for(int i = 1; i <= n; i++){
cin >> a[i];
}
build_tree(1, 1, n);
for(int i = 0; i < m; i++){
int a, b;
cin >> a >> b;
cout << que_min(1, 1, n, a, b) << endl;
}
return 0;
}