#include <iostream>
#include <vector>
#include <algorithm>
template <typename IT>
bool next_partial_permutation(IT beg, IT mid, IT end) {
if (beg == mid) { return false; }
if (mid == end) { return std::next_permutation(beg, end); }
auto p1 = mid;
while (p1 != end && !(*(mid - 1) < *p1))
++p1;
if (p1 != end) {
std::swap(*p1, *(mid - 1));
return true;
} else {
std::reverse(mid, end);
auto p3 = std::make_reverse_iterator(mid);
while (p3 != std::make_reverse_iterator(beg) && !(*p3 < *(p3 - 1)))
++p3;
if (p3 == std::make_reverse_iterator(beg)) {
std::reverse(beg, end);
return false;
}
auto p2 = end - 1;
while (!(*p3 < *p2))
--p2;
std::swap(*p3, *p2);
std::reverse(p3.base(), end);
return true;
}
}
int main() {
std::vector<int> z = {1, 1, 2, 3, 4, 4};
int m = 3;
int n = z.size();
do {
for (int j = 0; j < m; ++j)
std::cout << z[j] << ' ';
std::cout << std::endl;
} while (next_partial_permutation(z.begin(), z.begin() + m, z.end()));
for (int j = 0; j < n; ++j)
std::cout << z[j] << ' ';
std::cout << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgoKdGVtcGxhdGUgPHR5cGVuYW1lIElUPgpib29sIG5leHRfcGFydGlhbF9wZXJtdXRhdGlvbihJVCBiZWcsIElUIG1pZCwgSVQgZW5kKSB7CiAgICBpZiAoYmVnID09IG1pZCkgeyByZXR1cm4gZmFsc2U7IH0KICAgIGlmIChtaWQgPT0gZW5kKSB7IHJldHVybiBzdGQ6Om5leHRfcGVybXV0YXRpb24oYmVnLCBlbmQpOyB9CiAKICAgIGF1dG8gcDEgPSBtaWQ7CiAKICAgIHdoaWxlIChwMSAhPSBlbmQgJiYgISgqKG1pZCAtIDEpIDwgKnAxKSkKICAgICAgICArK3AxOwogCiAgICBpZiAocDEgIT0gZW5kKSB7CiAgICAgICAgc3RkOjpzd2FwKCpwMSwgKihtaWQgLSAxKSk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgewogICAgICAgIHN0ZDo6cmV2ZXJzZShtaWQsIGVuZCk7CiAgICAgICAgYXV0byBwMyA9IHN0ZDo6bWFrZV9yZXZlcnNlX2l0ZXJhdG9yKG1pZCk7CiAKICAgICAgICB3aGlsZSAocDMgIT0gc3RkOjptYWtlX3JldmVyc2VfaXRlcmF0b3IoYmVnKSAmJiAhKCpwMyA8ICoocDMgLSAxKSkpCiAgICAgICAgICAgICsrcDM7CiAKICAgICAgICBpZiAocDMgPT0gc3RkOjptYWtlX3JldmVyc2VfaXRlcmF0b3IoYmVnKSkgewogICAgICAgICAgICBzdGQ6OnJldmVyc2UoYmVnLCBlbmQpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogCiAgICAgICAgYXV0byBwMiA9IGVuZCAtIDE7CiAKICAgICAgICB3aGlsZSAoISgqcDMgPCAqcDIpKQogICAgICAgICAgICAtLXAyOwogCiAgICAgICAgc3RkOjpzd2FwKCpwMywgKnAyKTsKICAgICAgICBzdGQ6OnJldmVyc2UocDMuYmFzZSgpLCBlbmQpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfQp9CgppbnQgbWFpbigpIHsKICAgIHN0ZDo6dmVjdG9yPGludD4geiA9IHsxLCAxLCAyLCAzLCA0LCA0fTsKICAgIGludCBtID0gMzsKICAgIGludCBuID0gei5zaXplKCk7CiAgICAKICAgIGRvIHsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG07ICsraikKICAgICAgICAgICAgc3RkOjpjb3V0IDw8IHpbal0gPDwgJyAnOwogICAgICAgIAogICAgICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7CiAgICB9IHdoaWxlIChuZXh0X3BhcnRpYWxfcGVybXV0YXRpb24oei5iZWdpbigpLCB6LmJlZ2luKCkgKyBtLCB6LmVuZCgpKSk7CgogICAgZm9yIChpbnQgaiA9IDA7IGogPCBuOyArK2opCiAgICAgICAgc3RkOjpjb3V0IDw8IHpbal0gPDwgJyAnOwogICAgCiAgICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwp9Cg==