//
// Created by Vlad Nitu on 11.02.2023.
//
#include <bits/stdc++.h>
using namespace std;
#define NMAX (int)(100002)
#define INF (int)(1e9)
#define ll long long
#define mkp make_pair
#define mkt make_tuple
#define lsb(x) (x & -x)
int N, Q;
int T[3 * NMAX];
int mn;
// A[pos] = val
void update(int pos, int val, int node = 1, int node_lb = 1, int node_ub = N) { // update(pos, val)
if (node_lb == node_ub) T[node] = val;
else {
int mij = (node_lb + node_ub) / 2;
if (pos <= mij)
update(pos, val, node * 2, node_lb, mij);
else
update(pos, val, node * 2 + 1, mij + 1, node_ub);
T[node] = min(T[node * 2], T[node * 2 + 1]);
}
}
// min(a[i]), i in [a,b]
int query(int a, int b, int node = 1, int node_lb = 1, int node_ub = N) { // query(a, b)
if (a <= node_lb && b >= node_ub) mn = min(mn, T[node]);
else {
int mid = (node_lb + node_ub) / 2;
if (a <= mid)
query(a, b, node * 2, node_lb, mid);
if (b >= mid + 1)
query(a, b, node * 2 + 1, mid + 1, node_ub);
}
}
int x;
int a, b;
int main() {
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
cin.tie(nullptr);
cin.sync_with_stdio(false);
scanf("%d %d", &N, &Q);
for (int i = 1; i <= N; ++i) {
scanf("%d", &x);
update(i, x); // A[i] = x
}
while (Q--) {
scanf("%d %d", &a, &b);
mn = INT_MAX;
query(a, b);
printf("%d\n", mn);
}
return 0;
}