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)

#include <bits/stdc++.h>

const int MAXN = (int) 2e5;
const int LOG  =  (int) 17;


int v[MAXN + 1];
int rmq[2][MAXN + 1][LOG + 1];

char lg[MAXN + 1];

struct Data {
    int l, r;
    int pos;
    bool operator <(const Data &other) const {
         return v[pos] > v[other.pos];
    }
};

std::priority_queue <Data> pq;


inline int check(int l, int r, int p) {
    p %= 2;
    int p2 = lg[r - l + 1];
    if(v[rmq[p][l][p2]] < v[rmq[p][r - (1 << p2) + 1][p2]])
       return rmq[p][l][p2];
    return rmq[p][r - (1 << p2) + 1][p2];
}

int main() {
    FILE * fi, * fout;
    int i, n;
    //fi = fopen("A.in" ,"r");
    //fout = fopen("A.out" ,"w");
    fi=stdin;
    fout=stdout;
    fscanf(fi,"%d" ,&n);
    int pos;
    int min = (1 << 30);
    for(i = 1; i <= n; i++) {
        fscanf(fi,"%d" ,&v[i]);
        if(i % 2 == 1 && v[i] < min && i < n) {
           pos = i;
           min = v[i];
        }
    }
    for(i = 2; i <= n; i++)
        lg[i] = lg[i >> 1] + 1;
    v[0] = (1 << 30);
    for(i = 1; i <= n; i++)
        rmq[i & 1][i][0] = i;
    for(int p2 = 1; (1 << p2) <= n; p2++)
        for(i = 1; i + (1 << p2) <= n + 1; i++)
            for(int r = 0; r < 2; r++)
               if(v[rmq[r][i][p2 - 1]] < v[rmq[r][i + (1 << (p2 - 1))][p2 - 1]])
                  rmq[r][i][p2] = rmq[r][i][p2 - 1];
               else
                  rmq[r][i][p2] = rmq[r][i + (1 << (p2 - 1))][p2 - 1];
    pq.push({1, n, pos});
    while(!pq.empty()) {
         Data x = pq.top();
         pq.pop();
         pos = check(x.l, x.r, x.l + 1);
         fprintf(fout,"%d %d " ,v[x.pos],v[pos]);
         if(x.l < x.pos - 1)
           pq.push({x.l, x.pos - 1, check(x.l, x.pos - 2, x.l)});
         if(x.pos + 1 < pos - 1)
           pq.push({x.pos + 1, pos - 1, check(x.pos + 1, pos - 2, x.pos + 1)});
         if(pos + 1 < x.r)
           pq.push({pos + 1, x.r, check(pos + 1, x.r - 1, pos + 1)});
    }
    //fclose(fi);
    //fclose(fout);
    return 0;
}