Cod sursa(job #3318238)

Utilizator iulia_morariuIuli Morariu iulia_morariu Data 27 octombrie 2025 16:58:45
Problema Sortare prin comparare Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.83 kb
#include <bits/stdc++.h>
#define in  fin
#define out fout

using namespace std;

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

struct Node{
    int val, prio;
    Node* stanga = nullptr;
    Node* dreapta = nullptr;

    Node(const int valo){
        val = valo;
        prio = rand();
    }
};

Node* root;

pair< Node*, Node* > split(Node* nod, int val_dupa_care_split){
    if(nod == nullptr) return {nullptr, nullptr};

    if(nod->val <= val_dupa_care_split){
        auto [mid, dreapta] = split(nod->dreapta, val_dupa_care_split);
        nod->dreapta = mid;
        return {nod, dreapta};
    }else{
        auto [stanga, mid] = split(nod->stanga, val_dupa_care_split);
        nod->stanga = mid;
        return {stanga, nod};
    }
}

Node* join(Node* stanga, Node* dreapta){
    if(stanga == nullptr) return dreapta;
    if(dreapta == nullptr) return stanga;

    if(stanga->prio > dreapta->prio){
        /// atunci lowkey ala din stanga devine root si ala din dreapta e merge la alea
        stanga->dreapta = join(stanga->dreapta, dreapta);
        return stanga;
    }else{
        /// atunci lowkey ii simetric numa invers
        stanga->dreapta = join(stanga->dreapta, dreapta);
        return stanga;
    }
}

Node* insert(Node* root, int val){
    if(root == nullptr) return nullptr;
    auto [stanga, dreapta] = split(root, val);
    Node* nod_pt_ala_nou = new Node(val);
    return join( stanga, join(nod_pt_ala_nou, dreapta) );
}

void print_calumea(Node* root){
    if(root == nullptr) return;
    print_calumea(root->stanga);
    out << root->val << " ";
    print_calumea(root->dreapta);
}

signed main(){
    ios_base::sync_with_stdio(false);
    in.tie(NULL);

    root = nullptr;
    int n; in >> n;
    for(int i = 0; i < n; i++){
        int x; in >> x;
        root = insert(root, x);
    }

    print_calumea(root);

    return 0;
}