#include<cstdio>
#define N_MAX 100002
int *arbint;
FILE* in;
FILE* out;
int flog(int n)
{
if(n == 1)
return 0;
return 1 + flog(n >> 1);
}
int log(int n)
{
return flog((n - 1)) + 1;
}
int max(int a, int b)
{
return (a < b)?b:a;
}
int min(int a, int b)
{
return (a < b)?a:b;
}
int update(int pos, int x)
{
arbint[pos] = x;
while(pos) {
pos = (pos - 1) / 2;
arbint[pos] = min(arbint[2 * pos + 1], arbint[2 * pos + 2]);
}
}
int find(int root, int a, int b, int l, int r)
{
if((a <= l) && (b <= r))
return arbint[root];
int mid = (l + r) / 2;
if(b <= mid)
return find(2 * root + 1, a, b, l, mid);
else if(mid < a)
return find(2 * root + 2, a, b, mid + 1, r);
else
return min(find(2 * root + 1, a, mid, l, mid),
find(2 * root + 2, mid + 1, b, mid + 1,r));
}
int main()
{
in = fopen("rmq.in", "r");
out = fopen("rmq.out", "w");
int n, m;
int *A;
fscanf(in, "%d%d", &n, &m);
A = new int[n];
int rn = 1 << log(n);
arbint = new int[2 * rn];
for(int i = 0; i < 2 * rn; ++i)
arbint[i] = N_MAX;
for(int i = 0; i < n; ++i) {
fscanf(in, "%d", A + i);
update(rn - 1 + i, A[i]);
}
int a, b;
for(int i = 0; i < m; ++i) {
fscanf(in, "%d%d", &a, &b);
fprintf(out, "%d\n", find(0, a - 1, b - 1, 0, rn - 1));
}
return 0;
}