#include <bits/stdc++.h>
using namespace std;
inline bool isDigit(char c) {
return c >= '0' && c <= '9';
}
// citire numar natural
int readInt(FILE* fin) {
char ch;
int res = 0;
// eliminam caracterele de dinaintea numarului (spatiu, rand nou, orice caracter care nu este cifra)
while (!isDigit(ch = fgetc(fin)));
// adaugam cifrele la numar pana cand caracterul citit nu mai este cifra
do {
res = 10 * res + ch - '0';
} while (isDigit(ch = fgetc(fin)));
return res;
}
#define MAX_N 500000
int v[MAX_N];
void sort(int v[], int left, int right, int bitNumber) {
if (left >= right || bitNumber == -1)
return;
int i = left, j = right;
while (i <= j && (v[i] & (1 << bitNumber)) == 0)
++i;
while (j >= i && (v[j] & (1 << bitNumber)) > 0)
--j;
while (i < j) {
swap(v[i], v[j]);
while (i <= j && (v[i] & (1 << bitNumber)) == 0)
++i;
while (j >= i && (v[j] & (1 << bitNumber)) > 0)
--j;
}
j = left;
while (j <= right && (v[j] & (1 << bitNumber)) == 0)
++j;
// [left, j - 1]
sort(v, left, j - 1, bitNumber - 1);
// [j, right]
sort(v, j, right, bitNumber - 1);
}
int main() {
FILE* fin = fopen("algsort.in", "r");
int n, i;
fscanf(fin, "%d", &n);
for (i = 0; i < n; ++i)
v[i] = readInt(fin);
fclose(fin);
// Sortam intre [0, n - 1], pornind de la cel mai semnificativ bit (al 30-lea)
sort(v, 0, n - 1, 30);
FILE* fout = fopen("algsort.out", "w");
for (i = 0; i < n; ++i)
fprintf(fout, "%d ", v[i]);
fclose(fout);
return 0;
}