#include <cstdio>
#include <cstdlib>
#define NMax 500001
#define MAXINT (1<<30)-1+(1<<30)
using namespace std;
void vector_doi(int a[]);
void citire(FILE *f, FILE *g, int v[], int *n, int *ind, int a[]);
void printv(int *v, int n);
void print_and_close(FILE *g, int v[], int n);
int main()
{ int a[32];
vector_doi(a);
int *v1, *v2, tr[2] = {0}, n, ind = 0;
int **p1 = &v1, **p2 = &v2, **p;
FILE *f, *g;
v1 = (int*)malloc(NMax * sizeof(int));
v2 = (int*)malloc(NMax * sizeof(int));
citire(f, g, v1, &n, &ind, a);
int bit = 1;
while(!!(ind-- & -MAXINT))
{ for(int i = 0; i < n && ((*(*p1+i) & bit)?++tr[1]:++tr[0]); i++);
tr[1] += tr[0];
for(int i = n ; i ; i--)
if (*(*p1+i-1) & bit) --tr[1], *(*p2+tr[1]) = *(*p1+i-1);
else --tr[0], *(*p2+tr[0]) = *(*p1+i-1);
bit <<= 1;
tr[0] = tr[1] = 0;
p = p1, p1 = p2, p2 = p;
}
print_and_close(g, *p1, n);
return 0;
}
void print_and_close(FILE *g, int v[], int n)
{ g = fopen("algsort.out", "w");
for(int i = 0; i < n; ++i)
fprintf(g, "%d ", v[i]);
fclose(g);
}
void citire(FILE *f, FILE *g, int v[], int *n, int *ind, int a[])
{
f = fopen("algsort.in", "r");
fscanf(f, "%d ", n);
for(int i = 0; i < *n && (fscanf(f, "%d", &v[i])==1); i++)
while(a[*ind] < v[i] && ++*ind);
fclose(f);
return;
}
void vector_doi(int a[])
{ a[0] = 1;
for(int i = 1; i < 31; i++)
a[i] = a[i-1] << 1;
a[31] = MAXINT;
return;
}