#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <deque>
#include <unordered_map>
#include <numeric>
#include <iomanip>
using namespace std;
#define pii pair<long long, long long>
#define ll long long
#define FAST ios_base::sync_with_stdio(false); cin.tie(NULL)
const long long dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
const long long dl[2] = {1, -1};
const long long MOD = 1000000007;
const long long MAXN = 100005;
int N, M;
int arr[MAXN];
int seg_min[MAXN * 4];
int seg_max[MAXN * 4];
int sz;
void find_sz(){
int x = 1;
while(x < N){
x *= 2;
}
sz = x;
}
void build(){
for(int i = 0; i < N; i++){
seg_min[sz + i] = arr[i];
seg_max[sz + i] = arr[i];
}
for(int i = sz - 1; i >= 1; i--){
seg_min[i] = min(seg_min[i * 2], seg_min[i * 2 + 1]);
seg_max[i] = max(seg_max[i * 2], seg_max[i * 2 + 1]);
}
}
int query_min(int l, int r){
l += sz;
r += sz;
int ret = 2e9;
while(l <= r){
if(l % 2 == 1){
ret = min(ret, seg_min[l]);
l++;
}
if(r % 2 == 0){
ret = min(ret, seg_min[r]);
r--;
}
l /= 2; r /= 2;
}
return ret;
}
int query_max(int l, int r){
l += sz;
r += sz;
int ret = 0;
while(l <= r){
if(l % 2 == 1){
ret = max(ret, seg_max[l]);
l++;
}
if(r % 2 == 0){
ret = max(ret, seg_max[r]);
r--;
}
l /= 2; r /= 2;
}
return ret;
}
int main() {
FAST;
cin >> N >> M;
for(int i = 0; i < N; i++){
cin >> arr[i];
}
find_sz();
build();
for(int i = 0; i < M; i++){
int a, b;
cin >> a >> b;
a--;
b--;
if(a > b) swap(a, b);
cout << query_min(a, b) << " " << query_max(a, b) << "\n";
}
}
/*
10 4
75
30
100
38
50
51
52
20
81
5
1 10
3 5
6 9
8 10
*/