Problem:
Score : 800 points

Problem Statement

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.

Sample Input 1

4
3 2 4 1

Sample Output 1

3 1 2 4

The solution above is obtained as follows:

p

q

(3, 2, 4, 1)

()

↓

↓

(3, 1)

(2, 4)

↓

↓

()

(3, 1, 2, 4)

Sample Input 2

2
1 2

Sample Output 2

1 2

Sample Input 3

8
4 6 3 2 8 5 7 1

Sample Output 3

3 1 2 7 4 6 8 5

The solution above is obtained as follows:

p

q

(4, 6, 3, 2, 8, 5, 7, 1)

()

↓

↓

(4, 6, 3, 2, 7, 1)

(8, 5)

↓

↓

(3, 2, 7, 1)

(4, 6, 8, 5)

↓

↓

(3, 1)

(2, 7, 4, 6, 8, 5)

↓

↓

()

(3, 1, 2, 7, 4, 6, 8, 5)

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

    //A,Elebereth Gilthoniel mantae!
    //For Temeria!
    #include<iostream>
    #include<algorithm>
    #include<cmath>
    #include<string>
    #include<vector>
    #include<set>
    #include<cstdio>
    #include<map>
    #include<stack>
    #include<queue>
    #include<cstring> 
    using namespace std;
    int n,q[200008],p[200008];int pos[200008];int uj;vector<pair<int,pair<int,int> > >v;int u;
    int treeo[800008],treee[800008];
    void update(int x,int y,int t)
    {
    	if(t%2)
    	{
    		treeo[y]=x;
    		while(y>0)
    		{
    			y=y/2;
    			treeo[y]=min(treeo[y],x);
    		}
    	}
    	else
    	{
    		treee[y]=x;
    		while(y>0)
    		{
    			y=y/2;
    			treee[y]=min(treee[y],x);
    		}
    	}
    }
    int queryo(int node, int begin, int end, int left, int right)    
    {   
       	int p1, p2;    
    	if (left > end || right < begin)    return -1;      
       if (begin >= left && end <= right)    
                return treeo[node];    
            p1 = queryo(2 * node, begin, (begin + end) / 2, left, right);   
            p2 = queryo(2 * node + 1, (begin + end) / 2 + 1, end, left, right);     
            if (p1 == -1)    
                return p2;    
            if (p2 == -1)    
                return p1;    
            if (p1 <= p2)    
                return  p1;    
            return  p2;      
    }  
    int querye(int node, int begin, int end, int left, int right)    
    {  
       	int p1, p2;    
    	if (left > end or right <begin)    return -1;      
       if (begin >= left && end <= right)    
                return treee[node];    
            p1 = querye(2 * node, begin, (begin + end) / 2, left, right);   
            p2 = querye(2 * node + 1, (begin + end) / 2 + 1, end, left, right);     
            if (p1 == -1)    
                return p2;    
            if (p2 == -1)    
                return p1;    
            if (p1 <= p2)    
                return  p1;    
            return  p2;      
    }  
    int solve(int l,int r,int o)
    {
    	if(l>=r) return 0;
    	if(r==l+1)
    	{
    		v.push_back(make_pair(o,make_pair(p[l],p[r])));
    		return 1;
    	}
    	int mi=0;if(l%2) mi=queryo(1,1,u,l,r-1);else mi=querye(1,1,u,l,r-1);
    	int mii=0;if(pos[mi]%2) mii=querye(1,1,u,pos[mi]+1,r);else mii=queryo(1,1,u,pos[mi]+1,r);
    	v.push_back(make_pair(o,make_pair(mi,mii)));//cout<<l<<r<<" "<<mi<<mii;system("pause");
    	solve(l,pos[mi]-1,o);solve(pos[mi]+1,pos[mii]-1,o+1);solve(pos[mii]+1,r,o);return 1;
    }
    pair<int,pair<int,int> > aap[200008];
    int main()
    {
     	//freopen("","r",stdin);
    	//freopen("","w",stdout);
    	for(int i=0;i<800001;i++) treeo[i]=treee[i]=123456789;cin>>n;
    	u=1;while(u<n) u*=2;
    	for(int i=1;i<=n;i++) cin>>p[i],pos[p[i]]=i,update(p[i],i+u-1,i);
    	solve(1,n,0);for(int i=0;i<n/2;i++) aap[i]=v[i];
    	sort(aap,aap+n/2);
    	for(int i=0;i<n/2;i++)
    	{
    		cout<<aap[i].second.first<<" "<<aap[i].second.second<<" ";
    	}cout<<endl;
    	return 0;
    }
    //4 4 1 3 2