#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;
vector<int> pyramid_sort(vector<int>& arr, int length, int stage){
if(length <= 1) return arr;
if(length == 2){
if(arr[0] < arr[1]) swap(arr[0], arr[1]);
return arr;
}
const int range = (length/stage == 0 ? 1 : length/stage);
const int numSegments = (length - 1)/range + 1;
int times[numSegments]; memset(times, 0, sizeof times);
vector<int> newVector[numSegments];
vector<int> resultVector;
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] = pyramid_sort(newVector[i], newVector[i].size(), stage + 1);
}
while(resultVector.size() < length){
int cur_index = 0;
int cur_value = (int) -1e9;
for(int i = 0; i < numSegments; i++){
if(times[i] >= newVector[i].size()) continue;
if(cur_value <= newVector[i][times[i]]){
cur_value = newVector[i][times[i]];
cur_index = i;
}
}
resultVector.push_back(cur_value);
times[cur_index]++;
}
return resultVector;
}
bool isSorted(){
for(int i = 1; i < n; i++){
if(arr[i - 1] < arr[i]) return 0;
}
return 1;
}
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 = pyramid_sort(arr, n, 2);
}
for(int i = 0; i < n; i++) cout << arr[i] << ' ';
return 0;
}