#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
vector <int > arb;
void Actualizare(int radacina, int stanga, int dreapta, int pozitie, int valoare)
{
if(stanga == dreapta) {
arb[radacina] = valoare;
return;
}
int mijloc = (stanga + dreapta)/2;
if(pozitie <= mijloc)
Actualizare(2 * radacina, stanga, mijloc, pozitie, valoare);
else
Actualizare(2 * radacina + 1, mijloc + 1, dreapta, pozitie, valoare);
arb[radacina] = min(arb[2 * radacina], arb[2 * radacina + 1]);
}
int Interogare(int radacina, int stanga, int dreapta, int x, int y)
{
if(x <= stanga && dreapta <= y)
return arb[radacina];
int minim_stanga = 100000, minim_dreapta = 100000;
int mijloc = (stanga + dreapta)/2;
if(x <= mijloc)
minim_stanga = Interogare(2 * radacina, stanga, mijloc, x, y);
if(mijloc < y)
minim_dreapta = Interogare(2 * radacina + 1, mijloc + 1, dreapta, x, y);
return min(minim_stanga, minim_dreapta);
}
int main()
{int n, m, x, y, val, i;
f>>n>>m;
arb.resize(m * 4 + 1);
for(i = 1; i <= n; i++)
{
f >> val;
Actualizare(1, 1, n, i, val);
}
for(i = 1; i <= m; i++)
{
f >> x >> y;
g << Interogare(1, 1, n, x, y) <<"\n";
}
return 0;
}