Cod sursa(job #1480159)

Utilizator retrogradLucian Bicsi retrograd Data 2 septembrie 2015 10:43:35
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <fstream>
#include <algorithm>

using namespace std;

int V[500001];

struct SkipList {
    #define MAXD 18
    #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;
    }

    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(ofstream &fout) {
        for(int i=T[0].nxt[0]; i; i = T[i].nxt[0]) {
            fout<<T[i].key<<" ";
        }
    }
};
SkipList T;

int main() {
    ifstream fin("algsort.in");
    ofstream fout("algsort.out");

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

    return 0;
}