#include <iostream>
#include <stdio.h>
#include <unordered_map>
#include <algorithm>
#include <cstring>
#include <vector>
#include <map>
#include <cassert>
using namespace std;
uint32_t mem[17][100003];
bool memt[17][100003];
uint32_t x[100004];
void getValue(uint32_t mem[][100003], uint32_t *x, uint32_t index, uint32_t power, uint32_t n) {
if(!power) {
memt[0][index] = 1;
mem[0][index] = x[index];
return ;
}
if(memt[power][index]) {
return ;
}
getValue(mem, x, index, power - 1, n);
getValue(mem, x, index + (1 << (power - 1)), power - 1, n);
memt[power][index] = 1;
mem[power][index] = min(mem[power - 1][index], mem[power - 1][index + (1 << (power - 1))]);
}
uint32_t invervalValue(uint32_t mem[][100003], uint32_t left, uint32_t right, uint32_t n) {
uint32_t minim = 1<<30, index = 0, diff = right - left + 1;
while(diff) {
if(diff & 1) {
minim = min(minim, mem[index][left]);
left += (1 << index);
}
diff >>= 1;
index++;
}
return minim;
}
int main() {
FILE *fd = fopen("rmq.in", "r+");
FILE *fr = fopen("rmq.out", "w+");
uint32_t n, m;
fscanf(fd, "%d %d", &n, &m);
for(uint32_t i = 0; i < n; i++) {
fscanf(fd, "%d", &x[i]);
}
for(uint32_t i = 0; i < n; i++) {
for(uint32_t j = 0; (1 << j) < n; j++) {
getValue(mem, x, i, j, n);
}
}
for(int32_t i = 0; i < m; i++) {
uint32_t a, b;
fscanf(fd, "%d %d", &a, &b);
fprintf(fr, "%d\n", invervalValue(mem, a - 1, b - 1, n));
}
}