Pagini recente » Cod sursa (job #631154) | Cod sursa (job #57104) | Cod sursa (job #1572639) | Cod sursa (job #2678963) | Cod sursa (job #2301791)
/**
* Worg
*/
#include <vector>
#include <fstream>
std::ifstream fin("algsort.in"); std::ofstream fout("algsort.out");
unsigned int MAX_INF = (1U << 31) - 1;
struct Node {
int value, index;
Node *left_son, *right_son;
Node() : value(MAX_INF), index(1), left_son(NULL), right_son(NULL) {}
};
void Update(Node *node, int left, int right, int index, int value) {
if (left == right) {
node->value = value; node->index = index;
return;
}
int mid = (left + right) >> 1;
if (index <= mid) {
if (node->left_son == NULL) {
node->left_son = new Node(); node->left_son->index = left;
}
Update(node->left_son, left, mid, index, value);
} else {
if (node->right_son == NULL) {
node->right_son = new Node(); node->right_son->index = right;
}
Update(node->right_son, mid + 1, right, index, value);
}
node->value = MAX_INF; node->index = left;
if (node->left_son != NULL && node->left_son->value < node->value) {
node->value = node->left_son->value;
node->index = node->left_son->index;
}
if (node->right_son != NULL && node->right_son->value < node->value) {
node->value = node->right_son->value;
node->index = node->right_son->index;
}
}
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++) {
int value = seg_tree->value;
int index = seg_tree->index;
fout << value << " ";
Update(seg_tree, 1, n, index, MAX_INF);
}
fout << '\n';
return 0;
}