#include <algorithm>
#include <iostream>
#include <vector>
#include <iterator>
#include <numeric>
template<typename FwdIter>
void selection_sort(FwdIter beg, FwdIter end) {
for(FwdIter i = beg; i != end; ++i)
std::iter_swap(i, std::min_element(i, end));
}
template<typename RndIter>
void insertion_sort(RndIter beg, RndIter end)
{
for (RndIter i = beg; i != end; ++i)
std::rotate(std::upper_bound(beg, i, *i), i, i+1);
}
std::ostream& operator<<(std::ostream& os, const std::vector<int>& v)
{
copy(v.begin(), v.end(), std::ostream_iterator<int>(os, " "));
return os;
}
int main()
{
std::vector<int> v(20, 1);
partial_sum(v.begin(), v.end(), v.begin());
random_shuffle(v.begin(), v.end());
std::cout << "Before selection_sort: " << v << '\n';
selection_sort(v.begin(), v.end());
std::cout << "After selection_sort: " << v << '\n';
random_shuffle(v.begin(), v.end());
std::cout << "Before insertion_sort: " << v << '\n';
insertion_sort(v.begin(), v.end());
std::cout << "After insertion_sort: " << v << '\n';
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8aXRlcmF0b3I+CiNpbmNsdWRlIDxudW1lcmljPgoKdGVtcGxhdGU8dHlwZW5hbWUgRndkSXRlcj4Kdm9pZCBzZWxlY3Rpb25fc29ydChGd2RJdGVyIGJlZywgRndkSXRlciBlbmQpIHsKICAgIGZvcihGd2RJdGVyIGkgPSBiZWc7IGkgIT0gZW5kOyArK2kpCiAgICAgICAgc3RkOjppdGVyX3N3YXAoaSwgc3RkOjptaW5fZWxlbWVudChpLCBlbmQpKTsKfQoKCnRlbXBsYXRlPHR5cGVuYW1lIFJuZEl0ZXI+CnZvaWQgaW5zZXJ0aW9uX3NvcnQoUm5kSXRlciBiZWcsIFJuZEl0ZXIgZW5kKQp7CiAgICBmb3IgKFJuZEl0ZXIgaSA9IGJlZzsgaSAhPSBlbmQ7ICsraSkKICAgICAgICBzdGQ6OnJvdGF0ZShzdGQ6OnVwcGVyX2JvdW5kKGJlZywgaSwgKmkpLCBpLCBpKzEpOwp9CgpzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgdikKewogICAgY29weSh2LmJlZ2luKCksIHYuZW5kKCksIHN0ZDo6b3N0cmVhbV9pdGVyYXRvcjxpbnQ+KG9zLCAiICIpKTsKICAgIHJldHVybiBvczsKfQoKaW50IG1haW4oKQp7CiAgICBzdGQ6OnZlY3RvcjxpbnQ+IHYoMjAsIDEpOwogICAgcGFydGlhbF9zdW0odi5iZWdpbigpLCB2LmVuZCgpLCB2LmJlZ2luKCkpOwoKICAgIHJhbmRvbV9zaHVmZmxlKHYuYmVnaW4oKSwgdi5lbmQoKSk7CiAgICBzdGQ6OmNvdXQgPDwgIkJlZm9yZSBzZWxlY3Rpb25fc29ydDogIiA8PCB2IDw8ICdcbic7CiAgICBzZWxlY3Rpb25fc29ydCh2LmJlZ2luKCksIHYuZW5kKCkpOwogICAgc3RkOjpjb3V0IDw8ICJBZnRlciBzZWxlY3Rpb25fc29ydDogIiA8PCB2IDw8ICdcbic7CgogICAgcmFuZG9tX3NodWZmbGUodi5iZWdpbigpLCB2LmVuZCgpKTsKICAgIHN0ZDo6Y291dCA8PCAiQmVmb3JlIGluc2VydGlvbl9zb3J0OiAiIDw8IHYgPDwgJ1xuJzsKICAgIGluc2VydGlvbl9zb3J0KHYuYmVnaW4oKSwgdi5lbmQoKSk7CiAgICBzdGQ6OmNvdXQgPDwgIkFmdGVyIGluc2VydGlvbl9zb3J0OiAiIDw8IHYgPDwgJ1xuJzsKfQo=