//const int N = 2e5+5, K = 18;
//int argmin[N][K], a[N];
//int rangemin(int l, int r){
//    if(l > r)
//        return -1;
//    if(l == r)
//        return l;
//    else if((r-l+1)%2)
//        ++r;
//
//    int s = r-l+1;
//    int p = 1;
//    while((1<<(p+1)) < s)
//        ++p;
//    int u = argmin[l][p];
//    int v = argmin[r-(1<<p)+1][p];
//    if(a[u] < a[v])
//        return u;
//    return v;
//}
//void __(){
//    _(int,n);
//    rep(i,n){
//        cin >> a[i];
//        argmin[i][1] = argmin[i][0] = i;
//    }
//    rep(k,2,K-1){
//        rep(i,n){
//            if(i+(1<<(k-1)) < n){
//                int u = argmin[i][k-1];
//                int v = argmin[i+(1<<(k-1))][k-1];
//                if(a[u] < a[v])
//                    argmin[i][k] = u;
//                else
//                    argmin[i][k] = v;
//            }
//        }
//    }
//    vi ans;
//    set<int> nxt_occupied{-1,n};
//    priority_queue<pii,vpii,greater<pii> > pq;
//    {
//        int u = rangemin(0,n-1);
//        pq.push({a[u],u});
//    }
//    vb visited(n);
//    while(!pq.empty()){
//        int val,u;
//        tie(val,u) = pq.top(); pq.pop();
//        if(visited[u]) continue;
//        visited[u] = true;
//        ans.pb(val);
//        int ub = *nxt_occupied.lower_bound(u);
//        int v = rangemin(u+1,ub-1);
//        int last_occupied = *--nxt_occupied.lower_bound(u);
//        ans.pb(a[v]);
//        nxt_occupied.insert(u);
//        nxt_occupied.insert(v);
//        int w = rangemin(last_occupied+1,u-1);
//        u = rangemin(u+1,v-1);
//        if(u != -1) pq.push({a[u],u});
//        v = rangemin(v+1,ub-1);
//        if(v != -1) pq.push({a[v],v});
//        if(w != -1) pq.push({a[w],w});
//    }
//    print ans;
//}
//
#include <set>
#include <iomanip>
#include <algorithm>
#include <queue>
#include <cassert>
#include <vector>
#include <utility>
#include <iostream>
#include <string>
#define pb push_back
#define REP_INT(i,l,r) for(int i = l; i <= r; ++i)
#define REP_ZERO_INT(i,r) for(int i = 0; i < r; ++i)
#define GET_REP_MACRO(_1,_2,_3,_4,NAME,...) NAME
#define rep(...) GET_REP_MACRO(__VA_ARGS__,REP_ANY,REP_INT,REP_ZERO_INT)(__VA_ARGS__)
#define all(v) (v).begin(), (v).end()
#define sz(v) ll(v.size())
#define T1 template<typename T> static
using namespace std;
typedef long long ll;
typedef vector<bool> vb;
typedef vector<int> vi;
typedef pair<int, int> pii;
typedef vector<pii> vpii;
T1 ostream& operator<<(ostream& stream, const vector<T>& t);
T1 istream& read(T, T, istream& = cin);
struct _print {
    string sep,end;
    bool space;
    ostream &stream;
    _print(string _sep=" ",string _end="\n",
            ostream &_stream = cout)
        : sep(_sep),end(_end),space(false),
            stream(_stream) {}
    ~_print() { stream << end; }
    template <typename T>
        _print &operator , (const T &t) {
            if (space) stream << sep;
            space = true;
            stream << t;
            return *this;
        }
};
#define print _print(),
T1 ostream& operator<<(ostream& stream, const vector<T>& t){
    for(int i = 0; i < sz(t); ++i){
        stream << t[i];
        if(i+1 < sz(t))
            stream << ' ';
    }
    return stream;
}
#define INPUT_WITHOUT_INIT(type,name) type name; cin >> name
#define GET_INPUT_MACRO(_1,_2,_3,_4,_5,_6,_7,_8,NAME,...) NAME
#define _(...) GET_INPUT_MACRO(__VA_ARGS__,_IWI,_IWI,_IWI,_IWI,_IWI,_IWI,INPUT_WITHOUT_INIT)(__VA_ARGS__)
const int N = 2e5+5, K = 18;
int argmin[N][K], a[N];
int rangemin(int l, int r){
    if(l > r)
        return -1;
    if(l == r)
        return l;
    else if((r-l+1)%2)
        ++r;
    int s = r-l+1;
    int p = 1;
    while((1<<(p+1)) < s)
        ++p;
    int u = argmin[l][p];
    int v = argmin[r-(1<<p)+1][p];
    if(a[u] < a[v])
        return u;
    return v;
}
void __(){
    _(int,n);
    rep(i,n){
        cin >> a[i];
        argmin[i][1] = argmin[i][0] = i;
    }
    rep(k,2,K-1){
        rep(i,n){
            if(i+(1<<(k-1)) < n){
                int u = argmin[i][k-1];
                int v = argmin[i+(1<<(k-1))][k-1];
                if(a[u] < a[v])
                    argmin[i][k] = u;
                else
                    argmin[i][k] = v;
            }
        }
    }
    vi ans;
    set<int> nxt_occupied{-1,n};
    priority_queue<pii,vpii,greater<pii> > pq;
    {
        int u = rangemin(0,n-1);
        pq.push({a[u],u});
    }
    vb visited(n);
    while(!pq.empty()){
        int val,u;
        tie(val,u) = pq.top(); pq.pop();
        if(visited[u]) continue;
        visited[u] = true;
        ans.pb(val);
        int ub = *nxt_occupied.lower_bound(u);
        int v = rangemin(u+1,ub-1);
        int last_occupied = *--nxt_occupied.lower_bound(u);
        ans.pb(a[v]);
        nxt_occupied.insert(u);
        nxt_occupied.insert(v);
        int w = rangemin(last_occupied+1,u-1);
        u = rangemin(u+1,v-1);
        if(u != -1) pq.push({a[u],u});
        v = rangemin(v+1,ub-1);
        if(v != -1) pq.push({a[v],v});
        if(w != -1) pq.push({a[w],w});
    }
    print ans;
}
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout << fixed << setprecision(15);
        __();
}


Measured memory_bytes: 26864