#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<b;i++)
#define rrep(i,a,b) for(int i=a;i>=b;i--)
#define fore(i,a) for(auto &i:a)
#pragma GCC optimize ("-O3")
using namespace std; void _main(); int main() { cin.tie(0); ios::sync_with_stdio(false); _main(); }
//---------------------------------------------------------------------------------------------------
#define INF INT_MAX/2
#define def make_pair(INF,INF)
template<class V, int NV> struct SegTree { //[l,r]
    V comp(V l, V r) { return min(l, r); };
    vector<V> val; SegTree() { val = vector<V>(NV * 2, def); }
    V get(int l, int r) { if (l>r)return def;l+=NV;r+=NV+1;V ret=def; while(l<r){
        if(l&1)ret=comp(ret,val[l++]);if(r&1)ret=comp(ret,val[--r]);l/=2;r/= 2;}return ret;}
    void update(int i, V v) { i+=NV;val[i]=v;while(i>1)i>>=1,val[i]=comp(val[i*2],val[i*2+1]); }
    void add(int i, V v) { update(i, val[i + NV] + v); }};
int getrand(int L, int R) { // [L,R]
	random_device rd;
	mt19937 mt(rd());
	uniform_int_distribution<> rand(L, R);
	return rand(mt);
}
/*---------------------------------------------------------------------------------------------------
　　　　　　　　　　　 ∧＿∧  
　　　　　 ∧＿∧ 　（´<_｀ ）　 Welcome to My Coding Space!
　　　　 （ ´_ゝ`）　/　 ⌒i     
　　　　／　　　＼　 　  |　|     
　　　 /　　 /￣￣￣￣/　　|  
　 ＿_(__ﾆつ/　    ＿/ .| .|＿＿＿＿  
　 　　　＼/＿＿＿＿/　（u　⊃  
---------------------------------------------------------------------------------------------------*/




int N, P[201010];
SegTree<pair<int, int>, 1 << 18> st1, st2;
//---------------------------------------------------------------------------------------------------
vector<int> E[201010];
int PA[201010];
void dfs(int L, int R, int pa = 0) {
    pair<int, int> mi1, mi2;

    if (L + 1 == R) {
        E[pa].push_back(P[L]);
        PA[P[L]] = P[R];
        return;
    }

    if (L % 2 == 0) {
        mi1 = st1.get(L, R - 1);
        mi2 = st2.get(mi1.second + 1, R);
    } else {
        mi1 = st2.get(L, R - 1);
        mi2 = st1.get(mi1.second + 1, R);
    }

    int A = mi1.second;
    int B = mi2.second;

    E[pa].push_back(mi1.first);
    PA[mi1.first] = mi2.first;

    if (L != A) dfs(L, A - 1, mi1.first);
    if (A + 1 != B) dfs(A + 1, B - 1, mi1.first);
    if (R != B) dfs(B + 1, R, mi1.first);
}
//---------------------------------------------------------------------------------------------------
void print() {
    printf("%d\n", N);
    rep(i, 0, N) printf("%d ", P[i]);
    printf("\n ----------------------------- \n");
}
void debug() {
    N = 6;
    rep(i, 0, N) P[i] = i + 1;

    rep(i, 0, 1010) {
        int a = getrand(0, N - 1);
        int b = getrand(0, N - 1);
        swap(P[a], P[b]);
    }

    print();
}
//---------------------------------------------------------------------------------------------------
void _main() {
    cin >> N; rep(i, 0, N) cin >> P[i];
    //debug();

    rep(i, 0, N) {
        if (i % 2 == 0) st1.update(i, { P[i], i });
        else st2.update(i, { P[i], i });
    }

    dfs(0, N - 1);

    vector<int> ans;
    priority_queue<int> que;
    que.push(0);

    while (!que.empty()) {
        int q = -que.top(); que.pop();

        ans.push_back(q);
        ans.push_back(PA[q]);

        fore(i, E[q]) que.push(-i);
    }

    rep(i, 2, ans.size()) {
        if (2 < i) printf(" ");
        printf("%d", ans[i]);
    }
    printf("\n");
}

Measured memory_bytes: 52852