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: Runtime Error)

#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>

using namespace std;
#define inf 1e9
#define MAX 101010

typedef pair<int,int> pii;
typedef pair<pii,pii> pp;

struct segtree {
    int N;
    pii dat[2*MAX];
    segtree() {}
    segtree(int n) {
        N = 1;
        while(N < n) N *= 2;
        for(int i = 0; i < 2*N-1; i++)
            dat[i] = make_pair(inf, -1);
    }
    // update k th element
    void update(int k, int a) {
        k += N-1; // leaf
        dat[k] = make_pair(a, k-N+1);
        while(k > 0) {
            k = (k - 1) / 2;
            dat[k] = min(dat[k*2+1], dat[k*2+2]);
        }
    }
    // min [a, b)
    pii query(int a, int b) { return query(a, b, 0, 0, N); }
    pii query(int a, int b, int k, int l, int r) {
        if(r <= a or b <= l) return make_pair(inf, -1);
        if(a <= l and r <= b) return dat[k];
        int m = (l + r) / 2;
        return min(query(a, b, k*2+1, l, m), query(a, b, k*2+2, m, r));
    }
};

int main(void){
    int n;
    cin >> n;
    vector<int> pe(n), po(n);
    for (int i = 0; i < n; i++) {
        if (i%2) cin >> po[i], pe[i] = inf;
        else cin >> pe[i], po[i] = inf;
    }
    segtree se(n), so(n);
    for (int i = 0; i < n; i++) se.update(i, pe[i]), so.update(i,po[i]);
    
    priority_queue<pp, vector<pp>, greater<pp> > que;
    que.push(make_pair(se.query(0,n), make_pair(0,n)));
    
    vector<int> ans;
    while (!que.empty()) {
        pp a = que.top();
        int x = a.first.first, it = a.first.second, l = a.second.first, r = a.second.second;
        que.pop();
        
        if (it%2 == 0) {
            pii b = so.query(it, r);
            int y = b.first, it2 = b.second;
            if (it-l >= 2) que.push(make_pair(se.query(l,it), make_pair(l,it)));
            if (r-it2 >= 2) que.push(make_pair(se.query(it2+1,r), make_pair(it2+1,r)));
            if (it2-it >= 2) que.push(make_pair(so.query(it+1,it2), make_pair(it+1,it2)));
            ans.push_back(x);
            ans.push_back(y);
        }
        else {
            pii b = se.query(it, r);
            int y = b.first, it2 = b.second;
            if (it-l >= 2) que.push(make_pair(so.query(l,it), make_pair(l,it)));
            if (r-it2 >= 2) que.push(make_pair(so.query(it2+1,r), make_pair(it2+1,r)));
            if (it2-it >= 2) que.push(make_pair(se.query(it+1,it2), make_pair(it+1,it2)));
            ans.push_back(x);
            ans.push_back(y);
        }
    }
    
    for (int i = 0; i < ans.size(); i++) cout << ans[i] << (i==n-1 ? "\n" : " ");
}