#include <iostream>
#include <fstream>
#include <algorithm>
#define INT_MAX 2147483647
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
//segment tree size = 2^N
// total overlap, no overlap, partial overlap
int N, M, X, Y;
int seg_tree[2^(10000) + 66];
void Build(int nod, int left, int right, int Pos, int Val)
{
if (left == right)
{
seg_tree[nod] = Val;
return;
}
int mij = (left + right) / 2;
if (Pos <= mij)
Build(2 * nod, left, mij, Pos, Val);
if (Pos > mij)
Build(2 * nod + 1, mij + 1, right, Pos, Val);
if (seg_tree[2 * nod] < seg_tree[2 * nod + 1])
seg_tree[nod] = seg_tree[2 * nod];
else
seg_tree[nod] = seg_tree[2 * nod + 1];
}
int RMQ(int pos, int sl, int sr, int left, int right)
{
if (sl >= left && sr <= right)
return seg_tree[pos];
if (sr < left || sl > right)
return INT_MAX;
int mid = (sl + sr) / 2;
return min(RMQ(2*pos, sl, mid, left, right), RMQ(2*pos + 1, mid+1, sr, left, right));
}
int main()
{
f >> N >> M;
for (int i = 1; i <= N; i++)
{
f >> X; //citim valoarea
Build(1, 1, N, i, X);
}
for (int i = 1; i <=M; i++)
{
f >> X >> Y;
g << RMQ(1, 1, N, X, Y) << "\n";
}
}