#include <fstream>
#include <iostream>
using namespace std;
int v[1000001];
struct Node
{
int value;
int x, y;
Node *left;
Node *right;
};
Node* createTree(int lo, int hi)
{
if (hi - lo == 0)
{
Node *leaf = new Node();
leaf->value = v[hi];
leaf->x = lo;
leaf->y = hi;
leaf->left = NULL;
leaf->right = NULL;
return leaf;
}
Node* myNode = new Node();
myNode->x = lo;
myNode->y = hi;
int mid = (lo + hi) >> 1;
myNode->left = createTree(lo, mid);
myNode->right = createTree(mid + 1, hi);
myNode->value = min(myNode->left->value, myNode->right->value);
return myNode;
}
bool inclus (int fst1, int snd1, int fst2, int snd2)
{
if (fst2 <= fst1 && snd1 <= snd2)
return true;
return false;
}
bool testOverlap(int x1, int x2, int y1, int y2) {
return (x1 >= y1 && x1 <= y2) ||
(x2 >= y1 && x2 <= y2) ||
(y1 >= x1 && y1 <= x2) ||
(y2 >= x1 && y2 <= x2);
}
bool intersectie (int fst1, int snd1, int fst2, int snd2)
{
return testOverlap(fst1, snd1, fst2, snd2);
if (fst2 <= snd1)
return true;
return false;
}
int query(Node* crt, int fst, int lst, int lo, int hi)
{
if (inclus (fst, lst, lo, hi))
return crt->value;
int mid = (fst + lst) >> 1;
int stg = 100000;
if (intersectie (fst, mid, lo, hi))
stg = query (crt->left, fst, mid, lo, hi);
int dr = 100000;
if (intersectie (mid + 1, lst, lo, hi))
dr = query (crt->right, mid + 1, lst, lo, hi);
return min(stg, dr);
}
int main()
{
ifstream cin ("in");
ofstream cout("out");
int n; cin >> n;
int m; cin >> m;
for (int i = 0; i < n; ++i)
cin >> v[i];
Node* root = createTree(0, n - 1);
for (int i = 0; i < m; ++i)
{
int x, y;
cin >> x >> y;
--x, --y;
int answer = query (root, 0, n - 1, x, y);
cout << answer << "\n";
}
return 0;
}