Problem: 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

Solution (in CPP):

Solution:
#include<bits/stdc++.h>
using namespace std;
#define cl(a,b) memset(a,b,sizeof(a))
#define ll long long
#define pb push_back
#define gcd __gcd

#define For(i,j,k) for(int i=(j);i<k;i++)
#define lowbit(i) (i&(-i))
#define _(x) printf("%d\n",x)


const int maxn = 2e5+100;

int Log[maxn], dp[2][20][maxn],pos[maxn],a[maxn],n;

int rmq(int k, int l, int r){
    int p = Log[r-l+1];
    return min(dp[k][p][l], dp[k][p][r-(1<<p)+1]);
}

pair<int,int> cal(int l, int r) {
    int x=rmq(l&1, l ,r);
    //倒着贪心的，所以只能在同一段
    int y=rmq((pos[x]+1)&1, pos[x]+1, r);///hhhh
    return {-x, -y};
}

typedef pair<int,int> P;
typedef pair<P, P> PP;

int main(){
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
        pos[a[i]]=i;
    }
    for(int i=2;i<=n;i++){
        Log[i]=Log[i>>1]+1;
    }
    for(int i=0;i<2;i++){
        for(int j=0;j<n;j++){
            dp[i][0][j]=(j%2==i)?a[j]:(1<<30);
        }
        for(int j=1;1<<j<=n;j++){///hhh
            for(int k=0;k+(1<<j)-1<n;k++){
                dp[i][j][k]=min(dp[i][j-1][k], dp[i][j-1][k+(1<<j-1)]);
            }
        }
    }

    priority_queue<PP> Q;
    Q.push({cal(0, n-1), {0, n-1}});

    while(!Q.empty()) {
        PP it = Q.top();Q.pop();
        int x=it.first.first;
        int y=it.first.second;
        printf("%d %d ", -x, -y);
        int l=it.second.first;
        int r=it.second.second;
        x = pos[-x];
        y = pos[-y];
        if(x-1>l){
            Q.push({cal(l,x-1), {l,x-1}});
        }
        if(y+1<r) {
            Q.push({cal(y+1, r), {y+1, r}});
        }
        if(x+1 < y-1) {
            Q.push({cal(x+1, y-1), {x+1, y-1}});
        }
    }
    return 0;
}