#include <iostream>
#include <fstream>
using namespace std;
ifstream in("rmq.in");
ofstream out("rmq.out");
const int NMAX = 100001;
#define min(a, b) ((a) < (b) ? (a) : (b))
int v[NMAX], tree[2 * NMAX];
void buildArbInt(int node, int st, int dr)
{
if (st == dr)
{
tree[node] = v[st];
}
else
{
int mid = (st + dr) / 2;
buildArbInt(2 * node, st, mid);
buildArbInt(2 * node + 1, mid + 1, dr);
tree[node] = min(tree[2 * node], tree[2 * node + 1]);
}
}
int RMQ(int node, int st, int dr, int qst, int qdr)
{
if (qst <= st && dr <= qdr) return tree[node];
int mid = (st + dr) / 2;
if (qdr <= mid)
{
return RMQ(2 * node, st, mid, qst, qdr);
}
else if (qst > mid)
{
return RMQ(2 * node + 1, mid + 1, dr, qst, qdr);
}
else
{
int RMQst = RMQ(2 * node, st, mid, qst, qdr);
int RMQdr = RMQ(2 * node + 1, mid + 1, dr, qst, qdr);
return min(RMQst, RMQdr);
}
}
int main()
{
int n, m;
in >> n >> m;
for (int i = 0; i < n; i++)
{
in >> v[i];
}
buildArbInt(1, 0, n-1);
for (int i = 0; i < m; i++)
{
int qst, qdr;
in >> qst >> qdr;
out << RMQ(1, 0, n - 1, qst - 1, qdr - 1) << '\n';
}
return 0;
}