Cod sursa(job #2301896)

Utilizator andrei.arnautuAndi Arnautu andrei.arnautu Data 13 decembrie 2018 17:16:42
Problema Sortare prin comparare Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
/**
  *  Worg
  */
#include <vector>
#include <fstream>

std::ifstream fin("algsort.in"); std::ofstream fout("algsort.out");

unsigned int MAX_INF = 1U << 31;

std::vector<unsigned int > seg_tree;

void UpdateNode(int node, int left, int right) {
  int left_son = node << 1, right_son = left_son + 1;

  seg_tree[node] = std::min(seg_tree[left_son], seg_tree[right_son]);
}

void Update(int node, int left, int right, int index, int value) {
  if (left == right) {
    seg_tree[node] = value; return;
  }

  int mid = (left + right) >> 1;
  int left_son = node << 1, right_son = left_son + 1;

  if (index <= mid) {
    Update(left_son, left, mid, index, value);
  } else {
    Update(right_son, mid + 1, right, index, value);
  }

  UpdateNode(node, left, right);
}

void Extract(int node, int left, int right) {
  if (left == right) {
    fout << seg_tree[node] << " ";
    seg_tree[node] = MAX_INF;
    return;
  }

  int mid = (left + right) >> 1;
  int left_son = (node << 1), right_son = left_son + 1;

  if (seg_tree[left_son] < seg_tree[right_son]) {
    Extract(left_son, left, mid);
  } else {
    Extract(right_son, mid + 1, right);
  }

  UpdateNode(node, left, right);
}

int main() {
  int n; fin >> n;
  seg_tree = std::vector<unsigned int >(4 * n, MAX_INF);

  for (int i = 1; i <= n; i++) {
    int value; fin >> value;
    Update(1, 1, n, i, value);
  }

  for (int i = 1; i <= n; i++) {
    Extract(1, 1, n);
  }
  printf("\n");
  return 0;
}