#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+5;
int a[MAXN],nxt[MAXN],n,len;
bool b[MAXN];
struct node{
int x; int i;
}tree[MAXN];
void put(node k){
len++;
tree[len]=k;
int son=len;
while (son>1){
int fa=son/2;
if (tree[fa].x>=tree[son].x) return;
swap(tree[fa],tree[son]);
son=fa;
}
}
int get(){
node k=tree[1];
tree[1]=tree[len--];
int fa=1;
while (fa*2<=len){
int son=fa*2;
if (son+1<=len&&tree[son].x<tree[son+1].x) son++;
if (tree[fa].x>=tree[son].x) break;
swap(tree[son],tree[fa]);
fa=son;
}
if (b[k.i]) return get();
while (b[nxt[k.i]]&&nxt[k.i]<=n) {
nxt[k.i]=nxt[nxt[k.i]];
}
if (nxt[k.i]>n) return get();
cout<<a[k.i]<<' '<<a[nxt[k.i]]<<' ';
b[k.i]=b[nxt[k.i]]=1;
}
int main()
{
cin>>n;
for (int i=1;i<=n;i++) cin>>a[i];
for (int i=1;i<=n;i++){
tree[i].x=a[i];
tree[i].i=i;
nxt[i]=i+1;
if (i!=n) put(tree[i]);
}
for (int i=1;i<=n/2;i++) get();
}