#include <iostream>
#include <fstream>
using namespace std;
unsigned int *tree;
int min(int a, int b)
{
if (a > b) {
return b;
}
return a;
}
unsigned int buildTree(unsigned int *v, unsigned int node, int left, int right)
{
if (left == right)
{
tree[node] = v[left];
return v[left];
}
int mid = (left + right) / 2;
int minLeft = buildTree(v, node * 2, left, mid);
int minRight = buildTree(v, node * 2 + 1, mid + 1, right);
tree[node] = min(minLeft, minRight);
return tree[node];
}
int query(unsigned int *v, unsigned int node, int left, int right, unsigned int a, unsigned int b)
{
if (a <= left && right <= b) {
return tree[node];
}
int mid = (left + right) / 2;
int minLeft = INT32_MAX, minRight = INT32_MAX;
if (a <= mid) {
minLeft = query(v, node * 2, left, mid, a, b);
}
if (mid < b) {
minRight = query(v, node * 2 + 1, mid + 1, right, a, b);
}
return min(minLeft, minRight);
}
int main()
{
ifstream fin("rmq.in");
ofstream fout("rmq.out");
unsigned int n, m, i;
fin >> n >> m;
unsigned int *v = new unsigned int[n + 1];
for (i = 1; i <= n; ++i) {
fin >> v[i];
}
tree = new unsigned int[3 * n + 1];
buildTree(v, 1, 1, n);
unsigned int a, b;
while (m)
{
fin >> a >> b;
fout << query(v, 1, 1, n, a, b) << '\n';
--m;
}
fin.close();
fout.close();
return 0;
}