//#include <bits/stdc++.h>
//#define int long long
//
//using namespace std;
//
//struct Answer {
//    int a1;
//    int a2;
//    int a3;
//};
//
//signed main () {
//    int n, m, k;
//    cin >> n >> m >> k;
//    vector <set<int>> G1(n, set<int>());
//    vector <set<int>> G2(n, set<int>());
//    for (int i = 0; i < m; i++) {
//        int u, v;
//        cin >> u >> v;
//        u--;
//        v--;
//        G1[u].insert(v);
//        G1[v].insert(v);
//    }
//    for (int i = 0; i < k; i++) {
//        int u, v;
//        cin >> u >> v;
//        u--;
//        v--;
//        G2[u].insert(v);
//        G2[v].insert(u);
//    }
//    if (n == 3) {
//
//    } else {
//        cout << "YES";
//        vector <Answer> ans;
//        for (int i = 0; i < n; i++) {
//            for (auto x: G1[i]) {
//                if (G2[i].find(x) == G2[i].end()) {
//                    ans.push_back()
//                }
//            }
//        }
//    }


//#include <bits/stdc++.h>
//using namespace std;
//int n, m;
//vector <int> priority(n);
//void rec(int l, int r) {
//}
//int main() {
//    cin >> m >> n;
//    for (int i = 0; n > i; i++) {
//        int temp;
//        cin >> temp;
//    }
//}

//#include <bits/stdc++.h>
//using namespace std;
//int ans = 0;
//void rec(int a, int b) {
//    ans += a * b;
//    if (a == b && b == 1) {
//        return;
//    }
//    rec(max(a / 2, b), min(a / 2, b));
//    if (a % 2 == 0) {
//        rec(max(a / 2, b), min(a / 2, b));
//    } else {
//        rec(max(a / 2 + 1, b), min(a / 2 + 1, b));
//    }
//}
//
//int main() {
//    int n, m;
//    cin >> n >> m;
//    rec(max(n, m), min(n, m));
//    cout << ans;
//}
//

#include <bits/stdc++.h>
#define int long long

using namespace std;

int max_freq = 0;

void rec(vector<int> &answer, map<int, set<int>> &freq, int tec_freq, int best) {
    if (tec_freq == 0) {
        answer.push_back(best);
        return;
    }
    if (tec_freq == max_freq) {
        freq[tec_freq].erase(best);
        freq[tec_freq - 1].insert(best);
        rec(answer, freq, tec_freq - 1, best);
    } else {
        auto iter = freq[tec_freq].upper_bound(best);
        int iter_r = *iter;
        if (iter == freq[tec_freq].end()){
            return;
        }
        freq[tec_freq].erase(best);
        freq[tec_freq].erase(iter_r);
        freq[tec_freq - 1].insert(best);
        rec(answer, freq, tec_freq - 1, best);
        freq[tec_freq - 1].insert(iter_r);
        rec(answer, freq, tec_freq - 1, iter_r);
    }
}

signed main() {
    int n;
    cin >> n;
    map <int, set<int>> freq;
    map <int, int> num_level;
    for (int i = 0; i < n; i++) {
        int num;
        cin >> num;
        if (num_level.find(num) == num_level.end()) {
            num_level[num] = 0;
        }
        freq[num_level[num] + 1].insert(num);
        freq[num_level[num]].erase(num);
        num_level[num] += 1;
        max_freq = max(max_freq, num_level[num]);
    }

    int should_be = 1;
    int minus = 0;
    for (int i = max_freq; i >= 1; i--){
        if (freq[i].size() != should_be - minus) {
            cout << -1;
            return 0;
        }
        minus = should_be;
        should_be *= 2;
    }

    vector <int> answer;
    rec(answer, freq, max_freq, *freq[max_freq].begin());
    if (answer.size() != num_level.size()){
        cout << -1;
    } else {
        for (int i = 0; i < answer.size(); i++) {
            cout << answer[i] << " ";
        }
    }
}