#include <bits/stdc++.h>
using namespace std;
//#pragma GCC optimize("Ofast")
//#pragma GCC optimize("unroll-loops")
//#pragma GCC target("avx,avx2,fma")
#define ll long long
#define fi first
#define se second
#define pb push_back
#define vi vector<int>
#define vl vector<ll>
#define pi pair<int, int>
#define pl pair<ll,ll>
#define all(x) (x).begin(),(x).end()
int n;
vi a;
vector<vector<vi>> best;
vector<vi> nums;
void precalc(int cur) {
if (cur!=1) {
nums[cur]=nums[cur/2];
}
else {
nums[cur].pb(a[cur]);
}
if (2*cur<=n) {
nums[cur].pb(a[2*cur]);
}
if (2*cur+1<=n) {
nums[cur].pb(a[2*cur+1]);
}
best[cur].resize(nums[cur].size());
sort(all(nums[cur]));
if (2*cur<=n) {
precalc(2*cur);
}
if (2*cur+1<=n) {
precalc(2*cur+1);
}
}
void merge(int i, int t, int t1, int t2) {
int j=0;
int add=1;
while (j<best[2*i][t1].size() || j<best[2*i+1][t2].size()) {
int tj=j;
while (tj<best[2*i][t1].size() && tj<j+add) {
best[i][t].pb(best[2*i][t1][tj++]);
}
tj=j;
while (tj<best[2*i+1][t2].size() && tj<j+add) {
best[i][t].pb(best[2*i+1][t2][tj++]);
}
j+=add;
add*=2;
}
}
int dfs(int i, int val) {
int ind=lower_bound(all(nums[i]),val)-nums[i].begin();
if (best[i][ind].size()) {
return ind;
}
if (2*i>n) {
best[i][ind].pb(val);
return ind;
}
if (2*i+1>n) {
best[i][ind].pb(min(val,a[2*i]));
best[i][ind].pb(max(val,a[2*i]));
return ind;
}
best[i][ind].pb(min(val,min(a[2*i],a[2*i+1])));
if (best[i][ind][0]==val) {
int t1=dfs(2*i,a[2*i]);
int t2=dfs(2*i+1,a[2*i+1]);
merge(i,ind,t1,t2);
return ind;
}
if (best[i][ind][0]==a[2*i]) {
int t1=dfs(2*i,val);
int t2=dfs(2*i+1,a[2*i+1]);
merge(i,ind,t1,t2);
return ind;
}
int t1=dfs(2*i,val);
int t2=dfs(2*i+1,a[2*i]);
merge(i,ind,t1,t2);
vi t={min(val,min(a[2*i],a[2*i+1]))};
swap(t,best[i][ind]);
t1=dfs(2*i,a[2*i]);
t2=dfs(2*i+1,val);
merge(i,ind,t1,t2);
for (int j=0; j<t.size(); j++) {
if (t[j]!=best[i][ind][j]) {
if (t[j]<best[i][ind][j]) {
swap(t,best[i][ind]);
return ind;
}
break;
}
}
return ind;
}
int32_t main() {
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(0);
cin >> n;
a.resize(n+1);
best.resize(n+1);
nums.resize(n+1);
for (int i=1; i<=n; i++) {
cin >> a[i];
}
precalc(1);
int t=dfs(1,a[1]);
for (int i=0; i<n; i++) {
cout << best[1][t][i] << " \n"[i==n];
}
return 0;
}