#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define all(x) x.begin(), x.end()
using namespace std;
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(){
	int n;
	cin>>n;
	int m=n+1,k=0;
	while(!(m&1)){
	    m/=2;
	    k++;
	}
	k--;
	int ans[n+2]={};
	map<int,int> cnt;
	for(int i=1;i<=n;i++){
	    int x;
	    cin>>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(cnt[ans[1]]!=k+1){
        cout<<-1;
        return 0;
    }
	if(k==0){
	    cout<<ans[1];
	    return 0;
	}
	ans[(1<<(k-1))+1]=vec[2].se;
	if(cnt[ans[(1<<(k-1))+1]]!=k){
        cout<<-1;
        return 0;
    }
	if(k==1){
	    cout<<ans[1]<<' '<<ans[2];
	    return 0;
	}
	int cur=3,c=k-1;
	for(int i=2;k-i>1;i++){
	    int pos=(1<<(k-i))+1;
	    while(pos<=n){
	        ans[pos]=vec[cur++].se;
	        if(cnt[ans[pos]]!=c){
	        	cout<<-1;
	        	return 0;
			}
	        pos+=(1<<(k-i+1));
	    }
	    c--;
	}
	for(int i=1;i<=k+2;i++){
	    if(!ans[i]){
	        ans[i]=vec[cur++].se;
	        if(cnt[ans[i]]!=1){
	            cout<<-1;
	            return 0;
	        }
	    }
	}
	for(int i=1;i<=k+2;i++){
	    cout<<ans[i]<<' ';
	}
}
