#include <cstdio>
#include <iostream>
#define NMAX 100005
using namespace std;
int Arbore[4 * NMAX], minn;
void UpdateArb(int nod, int val, int st, int dr, int poz){
if(st == dr){
Arbore[nod] = val;
return;
}
int mij = (st + dr) / 2;
if(poz <= mij)
UpdateArb(2* nod, val, st, mij, poz);
else UpdateArb(2 * nod + 1, val, mij + 1, dr, poz);
Arbore[nod] = min(Arbore[nod * 2], Arbore[nod * 2 + 1]);
}
void Query(int nod, int st, int dr, int stanga, int dreapta){
if(stanga <= st && dr <= dreapta){
if(Arbore[nod] < minn)
minn = Arbore[nod];
return;
}
int mij = (st + dr) / 2;
if(stanga <= mij)
Query(2 * nod, st, mij, stanga, dreapta);
if(mij < dreapta)
Query(2 * nod + 1, mij + 1, dr, stanga, dreapta);
}
const int buffer = 655536;
int poz = buffer;
char buff[buffer + 1];
char getChar(){
if(poz == buffer){
fread(buff, 1, buffer, stdin);
poz = 0;
}
return buff[poz++];
}
int readInt(){
int num = 0;
char ch = getChar();
while(1){
if(ch == ' ' || ch == '\n')
break;
num = num * 10 + (ch - '0');
ch = getChar();
}
return num;
}
char afis[50005];
int sp = 0;
void write_ch(char ch){
if(sp == 50005){
fwrite(afis, 1, 50005, stdout);
sp = 0;
}
afis[sp++] = ch;
}
void write(int x){
while(x){
write_ch(x % 10 + '0');
x /= 10;
}
write_ch('\n');
}
void remain(){
fwrite(afis, 1, 50005, stdout);
}
int main()
{
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
int n, m;
n = readInt();
m = readInt();
for(int i = 1; i <= n; ++i){
int x;
x = readInt();
UpdateArb(1, x, 1, n, i);
}
for(int i = 1; i <= m; ++i){
int x, y;
x = readInt();
y = readInt();
minn = (1 << 30);
Query(1, 1, n, x, y);
write(minn);
}
remain();
return 0;
}