#include <iostream>
#include <vector>
#include <algorithm>
void mergesort(std::vector<int>& A, int l, int r);
void tmerge(std::vector<int>& A, int l, int m, int r);
void mergesort(std::vector<int>& A, int l, int r) {
if(l < r) {
int m = l + (r - l) / 2;
mergesort(A, l, m);
mergesort(A, m+1, r);
tmerge(A, l, m, r);
}
}
void tmerge(std::vector<int>& A, int l, int m, int r) {
std::vector<int> L;
std::vector<int> R;
int n1 = m - l + 1;
int n2 = r - m;
if(n1 > 0)
{
for(int i=0; i<n1; i++) L.push_back(0);
std::copy(A.begin() + l, A.begin() + (l+n1), L.begin());
}
if(n2 > 0)
{
for(int i=0; i<n2; i++) R.push_back(0);
std::copy(A.begin() + (l+n1), A.begin() + (l+n1+n2), R.begin());
}
std::vector<int>::iterator i = L.begin();
std::vector<int>::iterator j = R.begin();
std::vector<int>::iterator k = A.begin() + l;
while(i != L.end() && j != R.end()) {
if(*i <= *j) {
*k = *i;
i++;
}
else {
*k = *j;
j++;
}
k++;
}
while(i != L.end()) {
*k = *i;
i++;
k++;
}
while(j != R.end()) {
*k = *j;
j++;
k++;
}
}
void print_vector(std::vector<int> A) {
std::vector<int>::iterator it;
for(it = A.begin(); it != A.end(); ++it) {
std::cout << *it << " ";
}
}
int main() {
std::vector<int> A = {178, 1156, 136, 5, 6, 7};
mergesort(A, 0, A.size() - 1);
print_vector(A);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgoKdm9pZCBtZXJnZXNvcnQoc3RkOjp2ZWN0b3I8aW50PiYgQSwgaW50IGwsIGludCByKTsKCnZvaWQgdG1lcmdlKHN0ZDo6dmVjdG9yPGludD4mIEEsIGludCBsLCBpbnQgbSwgaW50IHIpOwoKCnZvaWQgbWVyZ2Vzb3J0KHN0ZDo6dmVjdG9yPGludD4mIEEsIGludCBsLCBpbnQgcikgewoKICAgIGlmKGwgPCByKSB7CgogICAgICAgIGludCBtID0gbCArIChyIC0gbCkgLyAyOwoKICAgICAgICBtZXJnZXNvcnQoQSwgbCwgbSk7CgogICAgICAgIG1lcmdlc29ydChBLCBtKzEsIHIpOwoKICAgICAgICB0bWVyZ2UoQSwgbCwgbSwgcik7CgogICAgfQp9Cgp2b2lkIHRtZXJnZShzdGQ6OnZlY3RvcjxpbnQ+JiBBLCBpbnQgbCwgaW50IG0sIGludCByKSB7CiAgIHN0ZDo6dmVjdG9yPGludD4gTDsKICAgc3RkOjp2ZWN0b3I8aW50PiBSOwogICBpbnQgbjEgPSBtIC0gbCArIDE7CiAgIGludCBuMiA9ICByIC0gbTsKICAgaWYobjEgPiAwKQogICB7CiAgICAgICBmb3IoaW50IGk9MDsgaTxuMTsgaSsrKSBMLnB1c2hfYmFjaygwKTsKICAgICAgIHN0ZDo6Y29weShBLmJlZ2luKCkgKyBsLCBBLmJlZ2luKCkgKyAobCtuMSksIEwuYmVnaW4oKSk7CiAgIH0KICAgaWYobjIgPiAwKQogICB7CiAgICAgICBmb3IoaW50IGk9MDsgaTxuMjsgaSsrKSBSLnB1c2hfYmFjaygwKTsKICAgICAgIHN0ZDo6Y29weShBLmJlZ2luKCkgKyAobCtuMSksIEEuYmVnaW4oKSArIChsK24xK24yKSwgUi5iZWdpbigpKTsKICAgfQogICBzdGQ6OnZlY3RvcjxpbnQ+OjppdGVyYXRvciBpID0gTC5iZWdpbigpOwogICBzdGQ6OnZlY3RvcjxpbnQ+OjppdGVyYXRvciBqID0gUi5iZWdpbigpOwogICBzdGQ6OnZlY3RvcjxpbnQ+OjppdGVyYXRvciBrID0gQS5iZWdpbigpICsgbDsKCiAgIHdoaWxlKGkgIT0gTC5lbmQoKSAmJiBqICE9IFIuZW5kKCkpIHsKICAgICAgIGlmKCppIDw9ICpqKSB7CiAgICAgICAgICAgKmsgPSAqaTsKICAgICAgICAgICBpKys7CiAgICAgICB9CiAgICAgICBlbHNlIHsKICAgICAgICAgICAqayA9ICpqOwogICAgICAgICAgIGorKzsKICAgICAgIH0KICAgICAgIGsrKzsKICAgfQoKICAgd2hpbGUoaSAhPSBMLmVuZCgpKSB7CiAgICAgICAqayA9ICppOwogICAgICAgaSsrOwogICAgICAgaysrOwogICB9CgogICB3aGlsZShqICE9IFIuZW5kKCkpIHsKICAgICAgICprID0gKmo7CiAgICAgICBqKys7CiAgICAgICBrKys7CiAgIH0KfQoKdm9pZCBwcmludF92ZWN0b3Ioc3RkOjp2ZWN0b3I8aW50PiBBKSB7CgogICAgc3RkOjp2ZWN0b3I8aW50Pjo6aXRlcmF0b3IgaXQ7CgogICAgZm9yKGl0ID0gQS5iZWdpbigpOyBpdCAhPSBBLmVuZCgpOyArK2l0KSB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICppdCA8PCAiICI7CiAgICB9Cn0KCgppbnQgbWFpbigpIHsKICAgIHN0ZDo6dmVjdG9yPGludD4gQSA9IHsxNzgsIDExNTYsIDEzNiwgNSwgNiwgN307CiAgICBtZXJnZXNvcnQoQSwgMCwgQS5zaXplKCkgLSAxKTsKCiAgICBwcmludF92ZWN0b3IoQSk7CgogICAgcmV0dXJuIDA7Cn0K