Cod sursa(job #2301791)

Utilizator andrei.arnautuAndi Arnautu andrei.arnautu Data 13 decembrie 2018 15:45:23
Problema Sortare prin comparare Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.56 kb
/**
  *  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;
}