#include <fstream>
#include <iostream>
#include <vector>
#include <utility>
using namespace std;
#define R(x) x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x
constexpr int trunchi_log_tab[] = {-1, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
R(4), R(5), R(5), R(6), R(6), R(6), R(6), R(7), R(7), R(7), R(7),
R(7), R(7), R(7), R(7)};
int trunchi_log(const int x){
int t, tt;
if(t = (x>>16)){
return (tt = t>>8) ? trunchi_log_tab[tt]<<24 : trunchi_log_tab[t]<<16; }
else{
return (t = x>>8) ? trunchi_log_tab[t]<<8 : trunchi_log_tab[x]; } }
void make_rmq(const vector<int>& v, vector<vector<int> >& rmq){
const int n = v.size();
rmq.resize(n);
for(int i = n-1, sz = 1, left = 1; i >= 0; --i, --left){
if(left == 0){
++sz;
left = (1<<(sz-1)); }
rmq[i].resize(sz);
rmq[i][0] = v[i]; }
for(int marime = 1; marime < rmq.front().size(); ++marime){
for(int i = 0; marime < rmq[i].size(); ++i){
rmq[i][marime] = min(rmq[i][marime-1], rmq[i+1<<(marime-1)][marime-1]); } } }
int query(const vector<vector<int> >& rmq, const int s, const int d){
const int dst = trunchi_log(d-s+1);
return min(rmq[s][dst], rmq[d-(1<<dst)+1][dst]); }
int main(){
ifstream f("rmq.in");
ofstream g("rmq.out");
int n, m;
f >> n >> m;
vector<int> v(n, 0);
for(auto& x : v){
f >> x; }
vector<vector<int> > rmq;
make_rmq(v, rmq);
for(int i = 0, a, b; i < m; ++i){
f >> a >> b;
g << query(rmq, a-1, b-1) << '\n'; }
return 0; }