#include <iostream>
#include <vector>
#include <list>
#include <algorithm>
#include <iterator>
#include <type_traits>
template<typename Iterator>
void merge_sort(Iterator begin, Iterator end)
{
static_assert( std::is_same<
typename std::iterator_traits<Iterator>::iterator_category,
std::random_access_iterator_tag
>::value, "merge_sort only likes random-access iterators" );
const auto n = std::distance(begin, end);
const auto p = n / 2;
if(n < 2)
return;
merge_sort(begin, begin + p);
merge_sort(begin + p, end);
std::inplace_merge(begin, begin + p, end);
}
template<typename T>
void merge_sort(T& v)
{
using std::begin;
using std::end;
merge_sort(begin(v), end(v));
}
int main()
{
int v1[] = {6,5,4,3,2,1};
std::vector<int> v2 = {6,5,4,3,2,1};
// std::list<int> v = {6,5,4,3,2,1};
merge_sort(v1);
for(auto const& x : v1)
std::cout << x << " ";
std::cout << std::endl;
merge_sort(v2);
for(auto const& x : v2)
std::cout << x << " ";
std::cout << std::endl;
return 0;
}
CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGxpc3Q+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxpdGVyYXRvcj4KI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgoKCnRlbXBsYXRlPHR5cGVuYW1lIEl0ZXJhdG9yPgp2b2lkIG1lcmdlX3NvcnQoSXRlcmF0b3IgYmVnaW4sIEl0ZXJhdG9yIGVuZCkKewogIHN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc2FtZTwKICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPEl0ZXJhdG9yPjo6aXRlcmF0b3JfY2F0ZWdvcnksIAogICAgICAgICAgICAgICAgICAgc3RkOjpyYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZwogICAgICAgICAgICAgICAgID46OnZhbHVlLCAibWVyZ2Vfc29ydCBvbmx5IGxpa2VzIHJhbmRvbS1hY2Nlc3MgaXRlcmF0b3JzIiApOwogIGNvbnN0IGF1dG8gbiA9IHN0ZDo6ZGlzdGFuY2UoYmVnaW4sIGVuZCk7CiAgY29uc3QgYXV0byBwID0gbiAvIDI7CgogIGlmKG4gPCAyKQogICAgcmV0dXJuOwoKICBtZXJnZV9zb3J0KGJlZ2luLCBiZWdpbiArIHApOwogIG1lcmdlX3NvcnQoYmVnaW4gKyBwLCBlbmQpOwoKICBzdGQ6OmlucGxhY2VfbWVyZ2UoYmVnaW4sIGJlZ2luICsgcCwgZW5kKTsKfQoKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kdm9pZCBtZXJnZV9zb3J0KFQmIHYpCnsKICB1c2luZyBzdGQ6OmJlZ2luOwogIHVzaW5nIHN0ZDo6ZW5kOwogIG1lcmdlX3NvcnQoYmVnaW4odiksIGVuZCh2KSk7Cn0KCmludCBtYWluKCkKewogIGludCB2MVtdID0gezYsNSw0LDMsMiwxfTsKICBzdGQ6OnZlY3RvcjxpbnQ+IHYyID0gezYsNSw0LDMsMiwxfTsKICAvLyBzdGQ6Omxpc3Q8aW50PiB2ID0gezYsNSw0LDMsMiwxfTsKCiAgbWVyZ2Vfc29ydCh2MSk7CiAgZm9yKGF1dG8gY29uc3QmIHggOiB2MSkKICAgIHN0ZDo6Y291dCA8PCB4IDw8ICIgIjsKICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwoKICBtZXJnZV9zb3J0KHYyKTsKICBmb3IoYXV0byBjb25zdCYgeCA6IHYyKQogICAgc3RkOjpjb3V0IDw8IHggPDwgIiAiOwogIHN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7CgogIHJldHVybiAwOwp9