#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)
#define repr(i, n) for (int i = (n); i >= 0; --i)
#define FOR(i, m, n) for (int i = (m); i < (n); ++i)
#define FORR(i, m, n) for (int i = (m); i >= (n); --i)
#define equals(a, b) (fabs((a) - (b)) < EPS)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
const ll mod = 1000000007;
//const ll mod = 998244353;
const int inf = 1e9 + 10;
const ll INF = 1e18;
const ld EPS = 1e-10;
const int dx[8] = {1, 0, -1, 0, 1, -1, -1, 1};
const int dy[8] = {0, 1, 0, -1, 1, 1, -1, -1};
template<class T> bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }
template<class T> bool chmin(T &a, const T &b) { if (a>b) { a=b; return 1; } return 0; }
typedef pair<int, int> P;

template<typename T>
struct RMQ {
  int n, ndat = 1;
  vector<T> dat;
  RMQ(int n = 0): n(n) {
    while (ndat < n) ndat *= 2;
    dat.resize(2 * ndat - 1, inf);
  }

  void update(int k, T a) {
    k += ndat - 1;
    dat[k] = a;
    while (k > 0) {
      k = (k - 1) / 2;
      dat[k] = min(dat[k * 2 + 1], dat[k * 2 + 2]);
    }
  }

  T query(int a, int b, int k, int l, int r) {
    if (r <= a || b <= l) return inf;
    if (a <= l && r <= b) return dat[k];
    else {
      T vl = query(a, b, k * 2 + 1, l, (l + r) / 2);
      T vr = query(a, b, k * 2 + 2, (l + r) / 2, r);
      return min(vl, vr);
    }
  }

  T query(int a, int b) {
    return query(a, b, 0, 0, ndat);
  }
};

int n;
int p[200200];

int idx[200200];
RMQ<int> rmq0(200200), rmq1(200200);
priority_queue<pair<P, P>> pq;



int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout << fixed << setprecision(25);

  cin >> n;
  rep(i, n) cin >> p[i];

  rep(i, n) idx[p[i]] = i;
  rep(i, n) {
    if (i & 1) rmq1.update(i, p[i]);
    else rmq0.update(i, p[i]);
  }
  int l = 0, r = n;
  int q0 = (l & 1 ? rmq1.query(l, r) : rmq0.query(l, r));
  q0 = idx[q0];
  int q1 = (l & 1 ? rmq0.query(q0, r) : rmq1.query(q0, r));
  q1 = idx[q1];
  pq.push({{-p[q0], -p[q1]}, {l, r}});
  vector<int> ans;
  while (pq.size()) {
    pair<P, P> pp = pq.top();
    pq.pop();
    ans.push_back(-pp.first.first);
    ans.push_back(-pp.first.second);
    l = pp.second.first;
    r = pp.second.second;
    q0 = idx[-pp.first.first];
    q1 = idx[-pp.first.second];
    int l1 = l, r1 = q0, l2 = q0 + 1, r2 = q1, l3 = q1 + 1, r3 = r;
    if (l1 < r1) {
      int q10 = (l1 & 1 ? rmq1.query(l1, r1) : rmq0.query(l1, r1));
      q10 = idx[q10];
      int q11 = (l1 & 1 ? rmq0.query(q10, r1) : rmq1.query(q10, r1));
      q11 = idx[q11];
      pq.push({{-p[q10], -p[q11]}, {l1, r1}});
    }
    l1 = l2, r1 = r2;
    if (l1 < r1) {
      int q10 = (l1 & 1 ? rmq1.query(l1, r1) : rmq0.query(l1, r1));
      q10 = idx[q10];
      int q11 = (l1 & 1 ? rmq0.query(q10, r1) : rmq1.query(q10, r1));
      q11 = idx[q11];
      pq.push({{-p[q10], -p[q11]}, {l1, r1}});
    }
    l1 = l3, r1 = r3;
    if (l1 < r1) {
      int q10 = (l1 & 1 ? rmq1.query(l1, r1) : rmq0.query(l1, r1));
      q10 = idx[q10];
      int q11 = (l1 & 1 ? rmq0.query(q10, r1) : rmq1.query(q10, r1));
      q11 = idx[q11];
      pq.push({{-p[q10], -p[q11]}, {l1, r1}});
    }
  }
  rep(i, n) cout << ans[i] << ' ';
  cout << '\n';
  

  




  
  return 0;
}


Measured memory_bytes: 11000