#include <iostream>
#include <vector>
using namespace std;
vector<int> merge(vector<int> a, vector<int> b) {
vector<int> res;
size_t ai = 0, bi = 0;
while (ai < a.size() && bi < b.size()) {
if (a[ai] <= b[bi])
res.push_back(a[ai++]);
else
res.push_back(b[bi++]);
}
if (ai == a.size())
res.insert(res.end(), b.begin() + bi, b.end());
else if (bi == b.size())
res.insert(res.end(), a.begin() + ai, a.end());
return res;
}
vector<int> mergeSort(vector<int>& arr) {
if (arr.size() < 2) return arr;
const size_t mid = arr.size() / 2;
vector<int> left(arr.begin(), arr.begin() + mid);
vector<int> right(arr.begin() + mid, arr.end());
return merge(mergeSort(left), mergeSort(right));
}
int main() {
vector<int> arr{ 9, 1, 2, 3, 4, 1, 5, 7, 9, 8, 5, 3, 4, 7, 2, 8 };
arr = mergeSort(arr);
for (const int& a : arr)
cout << a << ' ';
cout << endl;
}