#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin ("rmq.in");
ofstream fout("rmq.out");
int nodes[400100];
void construct(int pos, int left, int right, int i, int x)
{
if(left == right)
{
nodes[pos] = x;
return;
}
int mid=(left+right)/2;
if(i<=mid)
construct(pos*2,left,mid,i,x);
else
construct(pos*2+1,mid+1,right,i,x);
nodes[pos] = min(nodes[pos*2], nodes[pos*2+1]);
}
int min_value(int pos, int left, int right, int start, int finish)
{
if(start <= left && right <= finish)
return nodes[pos];
int mid = (left + right) / 2, v1 = 1<<30, v2 = 1<<30;
if(start <= mid)
v1 = min_value(pos * 2, left, mid, start, finish);
if(finish > mid)
v2 = min_value(pos * 2 + 1, mid + 1, right, start, finish);
return min(v1, v2);
}
int main()
{
int n, m, x;
fin>>n>>m;
for(int i = 1; i <= n; i++)
{
fin>>x;
construct(1, 1, n, i, x);
}
for(int i = 0; i < m; i++)
{
int a, b;
fin>>a>>b;
fout<<min_value(1, 1, n, a, b)<<'\n';
}
return 0;
}