Cod sursa(job #3318236)

Utilizator Nasa1004Ema Nicole Gheorghe Nasa1004 Data 27 octombrie 2025 16:54:53
Problema Sortare prin comparare Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#include <fstream>

using namespace std;

ifstream cin("algsort.in");
ofstream cout("algsort.out");

struct Node{
    int val;
    int prio;
    Node* fiust = nullptr;
    Node* fiudr = nullptr;
};

pair <Node*, Node*> split(Node* node, int val_split) {
    if(node == nullptr)
        return {nullptr, nullptr};
    if(node->val <= val_split) { ///rad si fiul st o sa ramana in st
        auto [fiunou, right] = split(node->fiudr, val_split);
        node->fiudr = fiunou;
        return {node, right};
    }
    else { ///vezi ce exact din fiul stang e in st
        auto [left, fiunou] = split(node->fiust, val_split);
        node->fiust = fiunou;
        return {left, node};
    }
}

Node* join(Node* left, Node* right) {
    if(left == nullptr)
        return right;
    if(right == nullptr)
        return left;
    if(left->prio > right->prio) {
        left->fiudr = join(left->fiudr, right);
        return left;
    }
    else {
        right->fiust = join(left, right->fiust);
        return right;
    }
}

Node* insert(Node* root, int val) {
    Node* new_node = new Node{val, rand()};
    auto [left, right] = split(root, val);
    return join(left, join(new_node, right));
}
void print(Node* node) {
    if(node == nullptr)
        return;
    print(node->fiust);
    delete node->fiust;
    cout << node->val << " ";
    print(node->fiudr);
    delete node->fiudr;
}

int main() {
    int n;
    cin >> n;
    Node* root = nullptr;
    for(int i = 1; i <= n; i++) {
        int a;
        cin >> a;
        root = insert(root, a);
    }
    print(root);
    return 0;
}