#include <iostream>
#include <stdlib.h>
#include <vector>
#include <stdlib.h>
#include <string.h>
#include <cmath>
#define GO_UP(x) (((x)-1) >> 1)
#define GO_LEFT(x) (((x) << 1) + 1)
#define GO_RIGHT(x) (((x) << 1) + 2)
using namespace std;
void read_vector(vector<int> &v, int n)
{
for (int i = 0; i < n; i++)
{
int x;
cin >> x;
v.push_back(x);
}
}
void build_segment_tree(int *segment_tree, vector<int> &v, int pos, int left, int right)
{
if (left == right)
{
segment_tree[pos] = v[left];
return;
}
int mid = (left + right) / 2;
build_segment_tree(segment_tree, v, GO_LEFT(pos), left, mid);
build_segment_tree(segment_tree, v, GO_RIGHT(pos), mid + 1, right);
segment_tree[pos] = min(segment_tree[GO_LEFT(pos)], segment_tree[GO_RIGHT(pos)]);
}
int query(int *segment_tree, int pos, int left, int right, int query_left, int query_right)
{
if (left == query_left && right == query_right)
return segment_tree[pos];
int mid = (left + right) / 2;
if (query_right <= mid)
{
return query(segment_tree, GO_LEFT(pos), left, mid, query_left, query_right);
}
if (mid < query_left)
{
return query(segment_tree, GO_RIGHT(pos), mid + 1, right, query_left, query_right);
}
return min(
query(segment_tree, GO_LEFT(pos), left, mid, query_left, mid),
query(segment_tree, GO_RIGHT(pos), mid + 1, right, mid + 1, query_right));
}
void read_query(int *segment_tree, int n, int m)
{
for (int i = 0; i < m; i++)
{
int x, y;
cin >> x >> y;
x--;
y--;
cout << query(segment_tree, 0, 0, n - 1, x, y) << '\n';
}
}
int main()
{
int n, m;
cin >> n >> m;
vector<int> v;
read_vector(v, n);
//Height of segment tree
int x = (int)(ceil(log2(n)));
// Maximum size of segment tree
int max_size = 2 * (int)pow(2, x) - 1;
int *segment_tree = new int[max_size];
build_segment_tree(segment_tree, v, 0, 0, v.size() - 1);
read_query(segment_tree, n, m);
delete[] segment_tree;
return 0;
}