Pagini recente » Cod sursa (job #1700633) | Cod sursa (job #837291) | Cod sursa (job #2279501) | Cod sursa (job #2403569) | Cod sursa (job #3318236)
#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;
}