Let N be a positive even number.

We have a permutation of (1, 2, ..., N), p = (p_1, p_2, ..., p_N). Snuke is constructing another permutation of (1, 2, ..., N), q, following the procedure below.

First, let q be an empty sequence. Then, perform the following operation until p becomes empty:

* Select two adjacent elements in p, and call them x and y in order. Remove x and y from p (reducing the length of p by 2), and insert x and y, preserving the original order, at the beginning of q.



When p becomes empty, q will be a permutation of (1, 2, ..., N).

Find the lexicographically smallest permutation that can be obtained as q.

Constraints

* N is an even number.
* 2 ≤ N ≤ 2 × 10^5
* p is a permutation of (1, 2, ..., N).

Input

Input is given from Standard Input in the following format:


N
p_1 p_2 ... p_N


Output

Print the lexicographically smallest permutation, with spaces in between.

Examples

Input

4
3 2 4 1


Output

3 1 2 4


Input

2
1 2


Output

1 2


Input

8
4 6 3 2 8 5 7 1


Output

3 1 2 7 4 6 8 5
#include<bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
int n;
int nu[200200];
int pos[200200];
int ans[200200];
struct SEG{
	int mi[1000100][2];
	void build(int rt,int l,int r)
	{
		if(l==r)
		{
			mi[rt][0]=mi[rt][1]=inf;
			mi[rt][l&1]=nu[l];
			return;
		}
		int mid=(l+r)/2;
		build(rt*2,l,mid);
		build(rt*2+1,mid+1,r);
		mi[rt][0]=min(mi[rt*2][0],mi[rt*2+1][0]);
		mi[rt][1]=min(mi[rt*2][1],mi[rt*2+1][1]);
	}
	int ask(int rt,int l,int r,int st,int ed,int sym)
	{
		if(l>ed||r<st)return inf;
		if(l>=st&&r<=ed)return mi[rt][sym];
		int mid=(l+r)/2;
		return min(ask(rt*2,l,mid,st,ed,sym),
					ask(rt*2+1,mid+1,r,st,ed,sym));
	}
}seg;

struct Sta{
	int l,r,mi;
	bool operator >(const Sta &o)const{
		return mi>o.mi;
	}
};

priority_queue<Sta,vector<Sta>,greater<Sta> >q;
int top;
void ins(int l,int r)
{
	int mi=seg.ask(1,1,n,l,r,l&1);
	q.push((Sta){l,r,mi});
}
void solve()
{
	q.push((Sta){1,n,seg.ask(1,1,n,1,n,1)});
	int l,r;
	Sta cur;
	while(!q.empty())
	{
		cur=q.top();q.pop();
		l=pos[cur.mi];
		r=pos[seg.ask(1,1,n,l+1,cur.r,(l+1)&1)];
		ans[++top]=nu[l];ans[++top]=nu[r];
		if(cur.l<=l-1)ins(cur.l,l-1);
		if(l+1<=r-1)ins(l+1,r-1);
		if(r+1<=cur.r)ins(r+1,cur.r);
	}
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;++i)
		scanf("%d",&nu[i]),pos[nu[i]]=i;
	seg.build(1,1,n);
	solve();
	for(int i=1;i<=n;++i)printf("%d ",ans[i]);
	puts("");
	return 0;
}
