#include <fstream>
#include <memory>
#include <cstdint>
#include <utility>
#include <cstdio>
using Array = std::unique_ptr<uint32_t[]>;
using index_t = int;
void swap(const Array& a, index_t p1, index_t p2) {
uint32_t aux = a[p1];
a[p1] = a[p2];
a[p2] = aux;
}
index_t partition(const Array& a, index_t lo, index_t hi) {
const uint32_t pivot = a[hi];
index_t i = lo;
for (index_t j = lo; j < hi; ++j) {
if (a[j] < pivot) {
swap(a, i, j);
i++;
}
}
swap(a, i, hi);
return i;
}
void quicksort(const Array& a, index_t lo, index_t hi) {
if (lo > hi) {
return;
}
index_t p = partition(a, lo, hi);
quicksort(a, lo, p - 1);
quicksort(a, p + 1, hi);
}
std::pair<Array, index_t> read() {
FILE* fin = fopen("algsort.in", "r");
index_t n;
fscanf(fin, "%d", &n);
Array a = std::make_unique<uint32_t[]>(size_t(n));
for (index_t i = 0; i < n; ++i) {
fscanf(fin, "%d", &a[i]);
}
fclose(fin);
return std::make_pair(std::move(a), n);
}
void print(const Array& a, index_t n) {
FILE* fout = fopen("algsort.out", "w");
for (index_t i = 0; i < n; ++i) {
fprintf(fout, "%d ", a[i]);
}
fout << std::endl;
}
int main() {
auto a = read();
quicksort(a.first, 0, a.second - 1);
print(a.first, a.second);
return 0;
}