unsigned int c[257],c1[257],c2[257],c3[257],c4[257],c5[257],c6[257],c7[257],c0[257],tmp[100000000];
void sort(unsigned *a, int n)
{
int dd=n-(n&7);
for(register int i=0;i<4;++i)
{
for(register int j=0;j<dd;j+=8)
{
++c0[((a[j ]>>(i*8))&255)];
++c1[((a[j+1]>>(i*8))&255)];
++c2[((a[j+2]>>(i*8))&255)];
++c3[((a[j+3]>>(i*8))&255)];
++c4[((a[j+4]>>(i*8))&255)];
++c5[((a[j+5]>>(i*8))&255)];
++c6[((a[j+6]>>(i*8))&255)];
++c7[((a[j+7]>>(i*8))&255)];
}
switch(n&7)
{
case 7:++c6[(a[dd+6]>>(i*8))&255];
case 6:++c5[(a[dd+5]>>(i*8))&255];
case 5:++c4[(a[dd+4]>>(i*8))&255];
case 4:++c3[(a[dd+3]>>(i*8))&255];
case 3:++c2[(a[dd+2]>>(i*8))&255];
case 2:++c1[(a[dd+1]>>(i*8))&255];
case 1:++c0[(a[dd ]>>(i*8))&255];
}
for(register int j=0;j<=255;++j)
{
c[j]+=c0[j];
c[j]+=c1[j];
c[j]+=c2[j];
c[j]+=c3[j];
c[j]+=c4[j];
c[j]+=c5[j];
c[j]+=c6[j];
c[j]+=c7[j];
c0[j]=0;
c1[j]=0;
c2[j]=0;
c3[j]=0;
c4[j]=0;
c5[j]=0;
c6[j]=0;
c7[j]=0;
}
for(register int j=1;j<=255;++j)c[j]+=c[j-1];
for(register int j=n-1;j>=0;--j)tmp[--c[(a[j]>>(i*8))&255]]=a[j];
for(register int j=0;j<=255;++j)c[j]=0;
for(register int j=0;j<n;++j)a[j]=tmp[j];
}
}