#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n;int m;
int a;int b;
int num[N];
vector<int>vec;
struct Node{int l,r,val;}tr[4*N];
void build(int c,int l,int r){
tr[c].l=l;tr[c].r=r;
if(l>=r){
tr[c].val=num[l];
return;
}
int mid=(l+r)/2;
build(c*2,l,mid);
build(c*2+1,mid+1,r);
tr[c].val=min(tr[c*2].val,tr[c*2+1].val);
return;
}
int query(int c,int x,int y){
if(tr[c].l==x&&tr[c].r==y){
return tr[c].val;
}
int mid=(tr[c].l+tr[c].r)/2;
if(y<=mid){return query(c*2,x,y);}
if(x>mid){return query(c*2+1,x,y);}
int ql=query(c*2,x,mid);
int qr=query(c*2+1,mid+1,y);
return min(ql,qr);
}
int main(){
scanf("%d%d",&m,&n);
for(int i=1;i<=m;++i){scanf("%d",&num[i]);}
build(1,1,n);
while(n--){
scanf("%d%d",&a,&b);
vec.push_back(query(1,a,b));
}
for(int i:vec){printf("%d ",i);}
return 0;
}