Cod sursa(job #1388984)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 15 martie 2015 21:02:10
Problema Sortare prin comparare Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <bits/stdc++.h>

using namespace std;

struct Node
{
    int key, size;
    Node *st, *dr;

    explicit Node() : key(0), size(0), st(NULL), dr(NULL) {
    }

    Node(const int k) : key(k), size(1), st(NULL), dr(NULL) {
    }
};

void update(Node* &A)
{
    A->size = 1;

    if (A->st != NULL) A->size += A->st->size;
    if (A->dr != NULL) A->size += A->dr->size;
}

Node* join(Node* &A, Node* &B)
{
    if (!A) return B;
    if (!B) return A;

    if (A->key > B->key)
        swap(A, B);

    Node *aux = A->st;

    if (A->st)
    {
        if (A->dr != NULL && A->dr->size < A->st->size)
            swap(A->st, A->dr);
    }

    A->st = join(A->st, B);
    update(A);

    return A;
}

int removeMin(Node* &H)
{
    int k = H->key;
    H = join(H->st, H->dr);

    return k;
}

void initHeap(Node* &H)
{
    H = NULL;
    srand(time(NULL));
}

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

    int N, a;

    in >> N;

    Node *H;
    initHeap(H);

    for ( int i = 1; i <= N; ++i )
    {
        in >> a;
        Node *n = new Node(a);
        H = join(H, n);
    }

    for ( int i = 1; i <= N; ++i )
        out << removeMin(H) << " ";

    return 0;
}