Pagini recente » Cod sursa (job #2355755) | Cod sursa (job #1282108) | Cod sursa (job #1538092) | Cod sursa (job #421887) | Cod sursa (job #1685175)
#include <bits/stdc++.h>
using namespace std;
#define FILE_IO
const int buffer = 1 << 13;
int icnt = buffer - 1;
char buff[buffer + 5];
char gchar()
{
if(++icnt == buffer)
{
fread(buff, buffer, 1, stdin);
icnt = 0;
}
return buff[icnt];
}
int gint()
{
char ch = gchar();
while(ch < '0' || '9' < ch)
ch = gchar();
int x = 0;
while('0' <= ch && ch <= '9')
{
x = x * 10 + ch - '0';
ch = gchar();
}
return x;
}
int N;
int cnt[305], done[305];
int v[500005], aux[500005];
void srt(int lft, int rgt)
{
int msk = 0;
for(int i = lft; i <= rgt; i++)
msk ^= (1 << i);
for(int i = 0; i < 256; i++)
cnt[i] = done[i] = 0;
for(int i = 1; i <= N; i++)
cnt[ (v[i] & msk) >> lft ] ++;
for(int i = 1; i < 256; i++)
cnt[i] += cnt[i - 1];
for(int i = 1; i <= N; i++)
{
int idx = (v[i] & msk) >> lft;
done[ idx ]++;
int iidx = cnt[ idx - 1 ] + done[ idx ];
aux[ iidx ] = v[i];
}
for(int i = 1; i <= N; i++)
v[i] = aux[i];
}
int pos = -1;
char obuff[buffer + 5];
void wbuff()
{
obuff[pos + 1] = 0;
printf("%s", obuff);
//fwrite(obuff, buffer, 1, stdout);
pos = 0;
}
void wchar(char ch)
{
if(++pos == buffer)
wbuff();
obuff[pos] = ch;
}
void wint(int x)
{
char nr[10];
int n = 0;
while(x)
{
nr[++n] = x % 10;
x /= 10;
}
while(n)
{
wchar(nr[n] + '0');
n--;
}
}
int main()
{
#ifdef FILE_IO
freopen("algsort.in", "r", stdin);
freopen("algsort.out", "w", stdout);
#endif
N = gint();
for(int i = 1; i <= N; i++)
v[i] = gint();
srt(0, 7);
srt(8, 15);
srt(16, 23);
srt(24, 31);
//for(int i = 1; i <= N; i++)
// printf("%d ", v[i]);
for(int i = 1; i <= N; i++)
{
wint(v[i]);
wchar(' ');
}
wchar('\n');
wbuff();
return 0;
}