//
// main.c
// rmq
//
// Created by Alexandru Bâgu on 11/27/13.
// Copyright (c) 2013 Alexandru Bâgu. All rights reserved.
//
#include <stdio.h>
int MIN( int a, int b)
{
if(a > b) return b;
return a;
}
int tree_height(int elem_count)
{
if(elem_count <= 1) return elem_count;
return elem_count + tree_height(elem_count / 2);
}
int bin_height(int n)
{
int i = 1;
while (i < n) i <<= 1;
return i;
}
int add(int elem, int index, int *T, int b_height)
{
int l = 1, r = b_height;
int mid, nod = 1;
while(l != r)
{
mid = (l + r) / 2;
if(mid >= index)
{
r = mid;
nod *= 2;
}
else
{
l = mid + 1;
nod = nod * 2 + 1;
}
}
T[nod] = elem;
while(nod > 0)
{
nod /= 2;
T[nod] = MIN(T[nod * 2], T[nod * 2 + 1]);
}
return 0;
}
int do_query(int nod, int l, int r, int a, int b, int *T, int *max)
{
if(l >= a && r <= b)
{
if(*max > T[nod]) *max = T[nod];
return 0;
}
int mid = (l + r) / 2;
if(a <= mid) do_query(nod * 2, l, mid, a, b, T, max);
if(mid < b) do_query(nod * 2 + 1, mid + 1, r, a, b, T, max);
return 0;
}
int query(int a, int b, int *T, int b_h)
{
int max = 0x7FFFFFFF;
do_query(1, 1, b_h, a, b, T, &max);
return max;
}
int main(int argc, const char * argv[])
{
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
int n, q;
scanf("%d %d", &n, &q);
int b_h = bin_height(n);
int t_h = tree_height(b_h) + 1;
int T[t_h], i;
for(i = 0; i < t_h; i++)
T[i] = 0x7FFFFFFF;
for(i = 1; i <= n; i++)
{
int e;
scanf("%d", &e);
add(e, i, T, b_h);
}
int a, b;
for(i = 0; i < q; i++)
{
scanf("%d %d", &a, &b);
printf("%d\n", query(a, b, T, b_h));
}
return 0;
}