Cod sursa(job #2041926)

Utilizator rangal3Tudor Anastasiei rangal3 Data 17 octombrie 2017 21:22:40
Problema Radix Sort Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <fstream>
#define in "radixsort.in"
#define out "radixsort.out"
#define N 10000003
#define NR_BITI 30
using namespace std;

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

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

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 bool &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()
{
    for(int b=0; b<NR_BITI; ++b)
    {
        for(int i=1; i<=n; ++i)
            add_nod(v[i],(v[i]>>b)%2); //daca bitul b+1 este 1, este adaugat in lista p[1]
                                      // altfel bitul este 0, deci este adaugat in lista p[0]
        nod *c = p[0],*q;
        int k = 0;

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

        while(c != NULL)
        {
            v[++k] = c->info;
            q = c;
            c = c->urm;
            delete q;
        }
        p[0] = p[1] = 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;
}