Cod sursa(job #1480166)

Utilizator retrogradLucian Bicsi retrograd Data 2 septembrie 2015 10:48:24
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include <algorithm>
#include <ctime>

using namespace std;

int V[500001];

struct SkipList {
    #define MAXD 14
    #define MAXN 500001

    struct node {
        int key, *nxt;
    };

    node T[MAXN];
    int nodes = 0;
    int stop[MAXD];

    SkipList() {
        T[0].key = INFINITY; T[0].nxt = new int[MAXD];
        for(int i=0; i<MAXD; i++)
            T[0].nxt[i] = 0;
        srand(time(0));
    }

    int find(int key) {
        int node = 0;
        for(int i=MAXD-1; i>=0; i--) {
            while(T[T[node].nxt[i]].key < key)
                node = T[node].nxt[i];
            stop[i] = node;
        }
        return T[node].nxt[0];
    }

    void insert(int key) {
        find(key);

        int cnt = 1;
        while(rand() % 2 && ++cnt <= MAXD);

        T[++nodes].key = key;
        T[nodes].nxt = new int[cnt];

        for(int i=0; i<cnt; i++) {
            T[nodes].nxt[i] = T[stop[i]].nxt[i];
            T[stop[i]].nxt[i] = nodes;
        }
    }

    void erase(int key) {
        int i = find(key);

        int cnt = sizeof(T[i].nxt) / sizeof(T[i].nxt[0]);
        for(int i=0; i<cnt; i++)
            T[stop[i]].nxt[i] = T[i].nxt[i];
    }

    void output() {
        for(int i=T[0].nxt[0]; i; i = T[i].nxt[0]) {
            printf("%d ", T[i].key);
        }
    }
};
SkipList T;

void Read(int &a) {
    char c;
    for(c = getchar(); !isdigit(c); c = getchar());
    for(a = 0; isdigit(c); a = a*10+c-'0', c = getchar());
}

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

    int n, val;
    Read(n);
    for(int i=1; i<=n; i++) {
        Read(val);
        T.insert(val);
    }
    T.output();

    return 0;
}