Pagini recente » Cod sursa (job #2405000) | Cod sursa (job #3184676) | Cod sursa (job #755975) | Cod sursa (job #1491357) | Cod sursa (job #2301889)
/**
* Worg
*/
#include <vector>
#include <fstream>
std::ifstream fin("algsort.in"); std::ofstream fout("algsort.out");
unsigned int MAX_INF = 1U << 31;
struct Node {
unsigned int value;
Node *left_son, *right_son;
Node() : value(MAX_INF), left_son(NULL), right_son(NULL) {}
};
void UpdateNode(Node *node) {
node->value = MAX_INF;
if (node->left_son != NULL && node->left_son->value < node->value) {
node->value = node->left_son->value;
}
if (node->right_son != NULL && node->right_son->value < node->value) {
node->value = node->right_son->value;
}
}
void Update(Node *node, int left, int right, int index, int value) {
if (left == right) {
node->value = value;
return;
}
int mid = (left + right) >> 1;
if (index <= mid) {
if (node->left_son == NULL) {
node->left_son = new Node();
}
Update(node->left_son, left, mid, index, value);
} else {
if (node->right_son == NULL) {
node->right_son = new Node();
}
Update(node->right_son, mid + 1, right, index, value);
}
UpdateNode(node);
}
void Extract(Node *node, int left, int right) {
if (left == right) {
fout << node->value << " ";
node->value = MAX_INF;
return;
}
int mid = (left + right) >> 1;
if (node->left_son->value < node->right_son->value) {
Extract(node->left_son, left, mid);
} else {
Extract(node->right_son, mid + 1, right);
}
UpdateNode(node);
}
int main() {
int n; fin >> n;
Node *seg_tree = new Node();
for (int i = 1; i <= n; i++) {
int value; fin >> value;
Update(seg_tree, 1, n, i, value);
}
for (int i = 1; i <= n; i++) {
Extract(seg_tree, 1, n);
}
fout << '\n';
return 0;
}