using System;
using System.Collections.Generic;
using System.IO;
public class Program {
public static void Main() {
StreamReader sr = new StreamReader(Console.OpenStandardInput());
using(StreamWriter sw = new StreamWriter(Console.OpenStandardOutput())){
string line = sr.ReadLine();
int N = int.Parse(line);
int[] arr = new int[N];
int[][] ans = new int[N][];
for (int i = 0 ; i < N; i++) {
ans[i] = new int[2];
}
string[] tokens = sr.ReadLine().Split();
for (int i = 0 ; i < N; i++) {
arr[i] = int.Parse(tokens[i]);
}
Stack<List<int>> stack = new Stack<List<int>>();
for (int i = 0 ; i < N; i++ ) {
while (stack.Count != 0 && arr[ stack.Peek()[0] ] > arr[i]) {
List<int> temp = stack.Pop();
int right = i;
int left = stack.Count == 0 ? -1 : stack.Peek()[stack.Peek().Count - 1];
for (int j = 0 ; j < temp.Count; j++) {
ans[temp[j]][0] = left;
ans[temp[j]][1] = right;
}
}
if (stack.Count != 0 && arr[stack.Peek()[0]] == arr[i]) {
stack.Peek().Add(i);
} else {
stack.Push(new List<int>() {
i
});
}
}
while (stack.Count != 0) {
List<int> temp = stack.Pop();
int right = -1;
int left = stack.Count == 0 ? -1 : stack.Peek()[stack.Peek().Count - 1];
for (int j = 0 ; j < temp.Count; j++) {
ans[temp[j]][0] = left;
ans[temp[j]][1] = right;
}
}
for(int i = 0 ; i < N ;i++){
sw.WriteLine(ans[i][0] + " " + ans[i][1]);
}
}
}
}