#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
struct data
{
int a,b;
bool operator <(const data &t) const
{
return a<t.a;
}
bool operator == (const data &t)const
{
return (a==t.a&&b==t.b);
}
}ans[200010],tmx[200010];
int nm[200010];
int lg[200010];
int f[2][25][200010];
int mi[30];
int n;
int mark[200010];
void work(int l,int r)
{
if(l>r) return;
if(l+1==r) {ans[r].a=nm[l];ans[r].b=nm[r];ans[l].a=nm[l];ans[l].b=nm[r];return;}
int tmp=r-l+1;
int min1=n+1,min2=n+1;
int p1=l,p2=l;
int fg=l%2;
for(int i=lg[tmp];i>=0;i--)
{
if(mi[i]<=tmp)
{
tmp-=mi[i];
min1=min(min1,f[fg][i][p1]);
p1+=mi[i];
}
}
fg^=1;
p1=mark[min1];
p2=p1+1;
tmp=r-p2+1;
for(int i=lg[tmp];i>=0;i--)
{
if(mi[i]<=tmp)
{
tmp-=mi[i];
min2=min(min2,f[fg][i][p2]);
p2+=mi[i];
}
}
p2=mark[min2];
work(l,p1-1);work(p1+1,p2-1);work(p2+1,r);
int t1=l,t2=p1+1,t3=p2+1;
int cnt=0;
tmx[cnt].a=min1,tmx[cnt++].b=min2;
tmx[cnt].a=min1,tmx[cnt++].b=min2;
while(t1<=p1-1||t2<=p2-1||t3<=r)
{
data anss;anss.a=anss.b=n+1;
if(t1<=p1-1) anss=min(anss,ans[t1]);
if(t2<=p2-1) anss=min(anss,ans[t2]);
if(t3<=r) anss=min(anss,ans[t3]);
if(anss==ans[t1]) tmx[cnt++]=ans[t1++];
else if(anss==ans[t2]) tmx[cnt++]=ans[t2++];
else tmx[cnt++]=ans[t3++];
}
for(int i=0;i<cnt;i++)
{
ans[i+l]=tmx[i];
}
}
int main()
{
freopen("ball.in","r",stdin);
freopen("ball.out","w",stdout);
mi[0]=1;for(int i=1;i<25;i++) mi[i]=mi[i-1]*2;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
lg[i]=mi[lg[i-1]]*2>=n?lg[i-1]:lg[i-1]+1;
scanf("%d",&nm[i]);
mark[nm[i]]=i;
f[i%2][0][i]=nm[i];
f[(i+1)%2][0][i]=n+1;
}
for(int i=1;i<=lg[n];i++)
{
for(int j=1;j<=n;j++)
{
if(j+mi[i]-1<=n)
{
f[0][i][j]=min(f[0][i-1][j],f[0][i-1][j+mi[i-1]]);
f[1][i][j]=min(f[1][i-1][j],f[1][i-1][j+mi[i-1]]);
}
}
}
work(1,n);
for(int i=1;i<=n;i+=2)
{
printf("%d %d ",ans[i].a,ans[i].b);
}
}