Cod sursa(job #1380139)

Utilizator geniucosOncescu Costin geniucos Data 6 martie 2015 22:19:35
Problema Sortare prin comparare Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include<cstdio>
#include<string>
#include<algorithm>

using namespace std;

int N, A, B, C, a[10000009], aux[10000009], cnt[300], ap[300];

void S (int left, int right)
{
    int msk = 0;

    for (int i=left; i<=right; i++)
        msk |= 1<<i;

    for (int i=0; i <= 256; i++)
        cnt[i] = 0;

    for (int i=1; i<=N; i++)
    {
        aux[i] = a[i];
        cnt[(a[i] & msk) >> left] ++;
    }

    ap[0] = 0;
    for (int i=1; i <= 256; i++)
        cnt[i] += cnt[i-1], ap[i] = 0;

    for (int i=1; i<=N; i++)
    {
        int type = (aux[i] & msk) >> left;

        ap[type] ++;

        if (type)
            a[cnt[type - 1] + ap[type]] = aux[i];
        else
            a[ap[type]] = aux[i];
    }
}

void Read (int &x) ;

string ans;
void Add_to_output (int x)
{
    int nr = 0, cif[20];
    while (x)
        cif[++nr] = x % 10, x /= 10;
    if (!ans.empty())
        ans += ' ';
    for (int i=nr; i>=1; i--)
        ans += (char) cif[i] + '0';
}

int main ()
{
freopen ("algsort.in", "r", stdin);
freopen ("algsort.out", "w", stdout);

Read (N);
for (int i=1; i<=N; i++)
    Read (a[i]);

S (0, 7);
S (8, 15);
S (16, 23);
S (24, 31);

for (int i=1; i<=N; i++)
    Add_to_output (a[i]);
printf ("%s\n", ans.c_str ());

return 0;
}

#define maxl 50000
int p = 0;
char sir[maxl];

void Next ()
{
    if (++p == maxl)
        fread (sir, 1, maxl, stdin), p = 0;
}

void Read (int &x)
{
    for (; sir[p] < '0' || sir[p] > '9'; Next ()) ;
    for (x = 0; sir[p] >= '0' && sir[p] <= '9'; Next ())
        x = x * 10 + sir[p] - '0';
}