Cod sursa(job #2301889)

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