Cod sursa(job #2042411)

Utilizator rangal3Tudor Anastasiei rangal3 Data 18 octombrie 2017 16:29:55
Problema Radix Sort Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>
#define in "radixsort.in"
#define out "radixsort.out"
#define N 10000003
#define CIF 10

using namespace std;

ifstream fin(in);
ofstream fout(out);

const int MAX = 1<<31 - 1;

struct nod
{
    nod *urm;
    int info;
}*p[CIF],*u[CIF];

int v[N];
int n,A,B,C;

void init()
{
    fin>>n>>A>>B>>C;
    v[1] = B;

    for(int i=2; i<=n; ++i)
        v[i] = ((long long)A * v[i-1] + B)%C;
}

inline void add_nod(const int &val,const int &b)
{
    nod *c = new nod;
    c->info = val;
    c->urm = NULL;

    if(p[b] == NULL)
        p[b] = u[b] = c;
    else
    {
        u[b]->urm = c;
        u[b]= c;
    }
}

void radix()
{
    int k;

    for(int pw = 1; pw <= MAX; pw*=10)
    {
        for(int i=1; i<=n; ++i) add_nod(v[i],(v[i]/pw)%10);

        k = 0;

        for(int i=0; i<CIF; ++i)
        {
            nod *c,*q;
            c = p[i];

            while(c != NULL){v[++k] = c->info;q = c;c = c->urm;delete q;}
            p[i] = NULL;
        }
    }

}

void afis()
{
    for(int i=1; i<=n; i+=10)
        fout<<v[i]<<" ";
}

int main()
{
    init();

    radix();

    afis();

    fin.close();
    fout.close();
    return 0;
}