#include <iostream>
#include <vector>
using namespace std;
vector<int> Merge(const vector<int> &v1, const vector<int> &v2)
{
vector<int> res;
int s1 = v1.size(), s2 = v2.size(), i, j;
/*
cout << endl;
for (int i = 0; i < s1; ++i)
cout << v1[i] << " ";
cout << endl;
for (int i = 0; i < s2; ++i)
cout << v2[i] << " ";
cout << endl;
*/
for (i = 0, j = 0; i < s1, j < s2;) {
if (v1[i] <= v2[j]) {
res.push_back(v1[i]);
++i;
}
else {
res.push_back(v2[j]);
++j;
}
}
if (i < s1) {
for (int var = i; var < s1; ++var)
res.push_back(v1[var]);
}
else {
for (int var = j; var < s2; ++var)
res.push_back(v2[var]);
}
return res;
}
vector<int> mergeSort(const vector<int> &arr, int left, int right)
{
// 3 9 7 1 5 4 2
if (left == right) return vector<int>{arr[left]};
int m = (left + right) / 2;
vector<int> first = mergeSort(arr, left, m);
vector<int> second = mergeSort(arr, m + 1, right);
vector<int> res = Merge(first, second);
/*
for (auto &it : res) cout << it << " ";
cout << endl;
*/
return res;
}
int main()
{
vector<int> arr{3, 9, 7, 1, 5, 4, 2};
vector<int> res = mergeSort(arr, 0, arr.size() - 1);
for (auto &it : res) cout << it << " ";
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnZlY3RvcjxpbnQ+IE1lcmdlKGNvbnN0IHZlY3RvcjxpbnQ+ICZ2MSwgY29uc3QgdmVjdG9yPGludD4gJnYyKQp7CiAgICB2ZWN0b3I8aW50PiByZXM7CiAgICBpbnQgczEgPSB2MS5zaXplKCksIHMyID0gdjIuc2l6ZSgpLCBpLCBqOwogICAgLyoKICAgIGNvdXQgPDwgZW5kbDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgczE7ICsraSkKICAgICAgICBjb3V0IDw8IHYxW2ldIDw8ICIgIjsKICAgIGNvdXQgPDwgZW5kbDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgczI7ICsraSkKICAgICAgICBjb3V0IDw8IHYyW2ldIDw8ICIgIjsKICAgIGNvdXQgPDwgZW5kbDsKICAgICovCiAgICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IHMxLCBqIDwgczI7KSB7CiAgICAgICAgaWYgKHYxW2ldIDw9IHYyW2pdKSB7CiAgICAgICAgICAgIHJlcy5wdXNoX2JhY2sodjFbaV0pOwogICAgICAgICAgICArK2k7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXMucHVzaF9iYWNrKHYyW2pdKTsKICAgICAgICAgICAgKytqOwogICAgICAgIH0KICAgIH0KICAgIGlmIChpIDwgczEpIHsKICAgICAgICBmb3IgKGludCB2YXIgPSBpOyB2YXIgPCBzMTsgKyt2YXIpCiAgICAgICAgICAgIHJlcy5wdXNoX2JhY2sodjFbdmFyXSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBmb3IgKGludCB2YXIgPSBqOyB2YXIgPCBzMjsgKyt2YXIpCiAgICAgICAgICAgIHJlcy5wdXNoX2JhY2sodjJbdmFyXSk7CiAgICB9CiAgICByZXR1cm4gcmVzOwp9Cgp2ZWN0b3I8aW50PiBtZXJnZVNvcnQoY29uc3QgdmVjdG9yPGludD4gJmFyciwgaW50IGxlZnQsIGludCByaWdodCkKewogICAgLy8gMyA5IDcgMSA1IDQgMgogICAgaWYgKGxlZnQgPT0gcmlnaHQpIHJldHVybiB2ZWN0b3I8aW50PnthcnJbbGVmdF19OwogICAgaW50IG0gPSAobGVmdCArIHJpZ2h0KSAvIDI7CiAgICB2ZWN0b3I8aW50PiBmaXJzdCA9IG1lcmdlU29ydChhcnIsIGxlZnQsIG0pOwogICAgdmVjdG9yPGludD4gc2Vjb25kID0gbWVyZ2VTb3J0KGFyciwgbSArIDEsIHJpZ2h0KTsKICAgIHZlY3RvcjxpbnQ+IHJlcyA9IE1lcmdlKGZpcnN0LCBzZWNvbmQpOwogICAgLyoKICAgIGZvciAoYXV0byAmaXQgOiByZXMpIGNvdXQgPDwgaXQgPDwgIiAiOwogICAgY291dCA8PCBlbmRsOwogICAgKi8KICAgIHJldHVybiByZXM7Cn0KCmludCBtYWluKCkKewogICAgdmVjdG9yPGludD4gYXJyezMsIDksIDcsIDEsIDUsIDQsIDJ9OwogICAgdmVjdG9yPGludD4gcmVzID0gbWVyZ2VTb3J0KGFyciwgMCwgYXJyLnNpemUoKSAtIDEpOwogICAgZm9yIChhdXRvICZpdCA6IHJlcykgY291dCA8PCBpdCA8PCAiICI7CiAgICByZXR1cm4gMDsKfQo=