#include<bits/stdc++.h>usingnamespacestd;constintlg=21;constintinf=1e9;classBinaryLifting{public:intn;vector<int>a;vector<vector<int>>jump;vector<vector<int>>dp;BinaryLifting(intn){this->n=n;a.resize(n);jump.resize(n,vector<int>(lg,-1));dp.resize(n,vector<int>(lg,inf));}voidprepare_lifts(){// jump[i][j] is the node that you would reach if you take 2^j
// steps starting from node i.
for(inti=0;i<n-1;i++){jump[i][0]=i+1;dp[i][0]=min(a[i],a[i+1]);}// Caution : Loop Order.
// You should iterate powers of 2 first.
for(intj=1;j<lg;j++){for(inti=0;i<n;i++){// Make the first half of the jump.
intmid=jump[i][j-1];if(mid==-1){continue;}// Make the second half of the jump.
jump[i][j]=jump[mid][j-1];dp[i][j]=min(dp[i][j-1],dp[mid][j-1]);}}}vector<int>split(intnum){vector<int>res;for(inti=0;i<lg;i++){if((1<<i)&num){res.push_back(i);}}returnres;}intwalk(intsrc,intsteps){vector<int>powers_of_2=split(steps);intnow=src;intres=a[src];for(intp:powers_of_2){res=min(res,dp[now][p]);now=jump[now][p];if(now==-1){break;}}returnres;}intget_min(intl,intr){returnwalk(l,r-l);}};voidsolve(){intn,q;cin>>n>>q;BinaryLiftingblift(n);for(inti=0;i<n;i++){cin>>blift.a[i];}blift.prepare_lifts();for(inti=0;i<q;i++){intl,r;cin>>l>>r;l--;r--;cout<<blift.get_min(l,r)<<"\n";}}intmain(intargc,char**argv){ios_base::sync_with_stdio(false);cin.tie(NULL);solve();}