//
// main.cpp
// Range minimum query
//
// Created by Mara Dascalu on 19/05/2021.
//
#include <iostream>
#include <fstream>
using namespace std;
ifstream input("rmq.in");
ofstream output("rmq.out");
const int n_max = 100000;
int n,m, intervSt, intervDr, val, arbint[n_max*4+1], val_max;
void build(int nod, int valSt, int valDr, int poz, int val){
if (valSt == valDr)
{
arbint[nod] = val;
return;
}
int mij = (valSt + valDr) / 2;
if (poz <= mij)
build(2*nod, valSt, mij, poz, val);
else build(2*nod+1, mij + 1, valDr, poz, val);
arbint[nod] = min(arbint[2*nod], arbint[2*nod+1]);
}
void query (int nod, int valSt, int valDr, int limitaSt, int limitaDr, int& minim){
if (limitaSt <= valSt && valDr <= limitaDr){
if (minim >= arbint[nod]) minim = arbint[nod];
return;
}
int mij = (valSt + valDr) / 2;
if (limitaSt <= mij)
query(2*nod, valSt, mij, limitaSt, limitaDr, minim);
if (mij < limitaDr)
query(2*nod+1, mij+1, valDr, limitaSt, limitaDr, minim);
}
int main(int argc, const char * argv[]) {
input>>n>>m;
for (int i = 1; i <= n; i++)
{
input>>val;
if (val > val_max) val_max = val;
build(1,1,n,i,val);
}
for (int i = 1; i <= m; i++)
{
input>>intervSt>>intervDr;
int min = val_max;
query(1,1,n,intervSt,intervDr, min);
output<<min<<"\n";
}
}