#include<bits/stdc++.h>
using namespace std;

mt19937_64 rd(time(0));
int rand(int L, int R){
    return L + rd() % (R - L + 1);
}

int n;
vector<int> arr;

bool isSorted(vector<int>& arr, int length){
    for(int i = 1; i < length; i++){
        if(arr[i - 1] < arr[i]) return 0;
    }

    return 1;
}

vector<int> bitmask_sort(vector<int>& arr, int length){
    if(length <= 1) return arr;
    if(length == 2){
        if(arr[0] < arr[1]) swap(arr[0], arr[1]);
        return arr;
    }

    const int numSegments = rand(2, 31);
    const int range = (length - 1)/numSegments + 1;

    vector<int> newVector[numSegments];

    for(int i = 0; i < numSegments; i++){
        for(int j = 0; j < range; j++){
            if(i*range + j >= length) break;

            newVector[i].push_back(arr[i*range + j]);
        }

        newVector[i] = bitmask_sort(newVector[i], newVector[i].size());
    }

    for(int mask = 0; ; mask = rand(0, (1 << numSegments) - 1)){
        if(__builtin_popcount(mask) <= 1) continue;
        if(isSorted(arr, arr.size())) break;

        int cur_length = 0;
        vector<int> get_bit;

        for(int i = 0; (mask >> i) > 0; i++){
            if((mask >> i) & 1){
                get_bit.push_back(i);
                cur_length += newVector[i].size();
            }
        }



        int times[numSegments]; memset(times, 0, sizeof times);
        vector<int> cur_vector;

        while(cur_vector.size() < cur_length){
            int cur_index = 0;
            int cur_value = (int) - 1e9;

            for(int i:get_bit){
                if(times[i] >= newVector[i].size()) continue;
                if(cur_value <= newVector[i][times[i]]){
                    cur_index = i;
                    cur_value = newVector[i][times[i]];
                }
            }

            cur_vector.push_back(cur_value);
            times[cur_index]++;
        }



        int index = 0, countTime = 0;

        for(int i:get_bit){
            while(index < newVector[i].size()){
                newVector[i][index] = cur_vector[countTime*range + index];
                arr[i*range + index] = cur_vector[countTime*range + index];
                index++;
            }

            countTime++;
            index = 0;
        }
    }

    return arr;
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    cin >> n;
    for(int i = 0; i < n; i++){
        int value; cin >> value;
        arr.push_back(value);
    }

    while(!isSorted(arr, n)){
        arr = bitmask_sort(arr, n);
    }

    for(int i = 0; i < n; i++) cout << arr[i] << ' ';

    return 0;
}
