#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define sz(v) (int)v.size()
#define all(x) x.begin(), x.end()
using namespace std;
const int N = 1e6 + 5;
int n,k=0,a[N],t[N<<2],ans[N];
map<int,int> cnt1;
void build(int v=1,int tl=1,int tr=(1<<k)){
	if(tl==tr){
		t[v]=ans[tl];
	}
	else{
		int tm=(tl+tr)>>1;
		build(v<<1,tl,tm);
		build(v<<1|1,tm+1,tr);
		t[v]=min(t[v<<1],t[v<<1|1]);
	}
	cnt1[t[v]]++;
	return;
}
bool cmp(pair<int,int> x,pair<int,int> y){
    return x.fi>y.fi ||(x.fi == y.fi and x.se<y.se);
}
int main(){
	cin>>n;
	int m=n+1;
	while(!(m&1)){
	    m/=2;
	    k++;
	}
	k--;
	map<int,int> cnt;
	for(int i=1;i<=n;i++){
	    int x;
	    cin>>x;
	    a[i]=x;
	    cnt[x]++;
	}
	vector<pair<int,int> > vec;
	for(auto it:cnt){
	    vec.pb({it.se,it.fi});
	}
	vec.pb({10000000,0});
	sort(all(vec),cmp);
	ans[1]=vec[1].se;
	if(k==0){
	    cout<<ans[1];
	    return 0;
	}
	ans[(1<<(k-1))+1]=vec[2].se;
	int cur=3,c=k-1;
	for(int i=2;k-i>=1;i++){
	    int pos=(1<<(k-i))+1;
	    while(pos<=(1<<k)){
	        ans[pos]=vec[cur++].se;
	        pos+=(1<<(k-i+1));
	    }
	    c--;
	}
	for(int i=1;i<=(1<<k);i++){
	    if(!ans[i]){
	        ans[i]=vec[cur++].se;
	    }
	}
	build();
	vector<int> vec1;
	for(auto it:cnt1){
	    for(int j=1;j<=it.se;j++){
	        vec1.pb(it.fi);
	    }
	}
	sort(a+1,a+n+1);
	sort(all(vec1));
	for(int i=1;i<=n;i++){
	    if(a[i]!=vec1[i-1]){
	        cout<<-1;
	        return 0;
	    }
	}
	for(int i=1;i<=(1<<k);i++){
	    cout<<ans[i]<<' ';
	}
}
