import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
// 79题
class MessageBox{
public Map<Integer, Node> headMap;
public Map<Integer, Node> tailMap;
public int lastPrintVal;
public MessageBox() {
headMap = new HashMap<>();
tailMap = new HashMap<>();
lastPrintVal = 0;
}
public void receiveMsg(int num){
if(num < 1){
return;
}
Node curNode = new Node(num);
headMap.put(num, curNode);
tailMap.put(num, curNode);
// 判断区间是否可以合并
if(tailMap.containsKey(num-1)){ // 首尾有,连接两个区间
Node tailNode = tailMap.get(num - 1);
tailNode.next = curNode;
// 删除老的区间节点
tailMap.remove(num - 1);
headMap.remove(num);
}
// 经过上一步后肯定有tailMap是 num 的节点的
// 接着判断是否能连接某个头部是 num + 1的节点
if(headMap.containsKey(num + 1)){ //
Node tailNode = tailMap.get(num);
tailNode.next = headMap.get(num + 1);
// 删除老的节点
tailMap.remove(num);
headMap.remove(num + 1);
}
// 最后判断打印与否
if(headMap.containsKey(lastPrintVal + 1)){
printMsg(num);
}
}
private void printMsg(){
Node headNode = headMap.get(lastPrintVal + 1);
lastPrintVal ++;
headMap.remove(headNode.val);
while (headNode != null){
System.out.print(headNode.val + " ");
headNode = headNode.next;
lastPrintVal ++;
}
tailMap.remove(lastPrintVal - 1);
lastPrintVal --;
System.out.println();
}
private void printMsg(int num){
Node headNode = headMap.get(lastPrintVal + 1);
lastPrintVal ++;
headMap.remove(headNode.val);
while (headNode != null){
System.out.println(headNode.val + " " + num);
headNode = headNode.next;
lastPrintVal ++;
}
tailMap.remove(lastPrintVal - 1);
lastPrintVal --;
}
class Node{
public int val;
public Node next;
public Node(int val, Node next) {
this.val = val;
this.next = next;
}
public Node(int val) {
this.val = val;
this.next = null;
}
}
}
public class Main {
public static Scanner sc = new Scanner(System.in);
public static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
public static void main(String[] args) throws Exception {
int n = sc.nextInt();
MessageBox messageBox = new MessageBox();
for(int i=0;i<n;i++){
int val = sc.nextInt();
messageBox.receiveMsg(val);
}
}
}
/*
9
2 1 4 5 7 3 9 8 6
1 1
2 1
3 3
4 3
5 3
6 6
7 6
8 6
9 6
消息流吐出2,一种结构接收而不打印2,因为1还没出现。
消息流吐出1,一种结构接收1,并且打印:1, 2。
消息流吐出4,一种结构接收而不打印4,因为3还没出现。
消息流吐出5,一种结构接收而不打印5,因为3还没出现。
消息流吐出7,一种结构接收而不打印7,因为3还没出现。
消息流吐出3,一种结构接收3,并且打印:3, 4, 5。
消息流吐出9,一种结构接收而不打印9,因为6还没出现。
消息流吐出8,一种结构接收而不打印8,因为6还没出现。
消息流吐出6,一种结构接收6,并且打印:6, 7, 8, 9。
*/