unsigned b[100000005], c1[0x10000],c2[0x10000];
void sort(unsigned *a, int n){
for (int i = 0; i != n; ++i)
++c1[a[i] & 0xFFFF], ++c2[a[i] >> 16];
for (int i = 1; i != 0x10000; ++i)
c1[i] += c1[i - 1];
for (int i = 1; i != 0x10000; ++i)
c2[i] += c2[i - 1];
for (int i = n - 1; i >= 0; --i)
b[--c1[a[i] & 0xFFFF]] = a[i];
for (int i = n - 1; i >= 0; --i)
a[--c2[b[i] >> 16]] = b[i];
}