Cod sursa(job #1456994)

Utilizator retrogradLucian Bicsi retrograd Data 2 iulie 2015 15:48:58
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <bits/stdc++.h>

using namespace std;
typedef int var;


#define MAXD 20
#define INF (1<<31-1)

struct nod {
    var val, sz;
    nod **leg;
    nod(var x, var s) {
        val = x;
        sz = s;
        leg = new nod*[sz];
    }
};
typedef nod* pnod;

pnod Temp[MAXD];
pnod root, nill;

pnod Find(var val) {
    pnod p = root;
    for(var d=MAXD-1; d>=0; d--) {
        while(p->leg[d]->val < val)
            p = p->leg[d];
        Temp[d] = p;
    }
    return p;
}

void init() {
    root = new nod(-INF, MAXD);
    nill = new nod(INF, 0);

    for(var i=0; i<MAXD; i++)
        root->leg[i] = nill;
}

void insert(var val) {
    Find(val);
    var sz = 1;
    while(rand() % 2) sz++;

    pnod p = new nod(val, sz);
    for(var d=0; d<sz; d++) {
        p->leg[d] = Temp[d]->leg[d];
        Temp[d]->leg[d] = p;
    }
}

void erase(var val) {
    pnod p = Find(val)->leg[0];
    var sz = p->sz;

    for(var d=0; d<sz; d++) {
        Temp[d]->leg[d] = p->leg[d];
    }
    delete[] p->leg;
    delete p;
}

int main() {

    srand(time(NULL));
    ifstream fin("algsort.in");
    ofstream fout("algsort.out");

    var n, val;
    fin>>n;

    init();

    while(n--) {
        fin>>val;
        insert(val);
    }

    for(pnod p = root->leg[0]; p != nill; p = p->leg[0])
        fout<<p->val<<" ";

    return 0;
}