#include <iostream>
#include <vector>
#include <algorithm>
void nextPartialPerm(std::vector<int> &z, int n1, int m1) {
int p1 = m1 + 1;
while (p1 <= n1 && z[m1] >= z[p1])
++p1;
if (p1 <= n1) {
std::swap(z[p1], z[m1]);
} else {
std::reverse(z.begin() + m1 + 1, z.end());
p1 = m1;
while (z[p1 + 1] <= z[p1])
--p1;
int p2 = n1;
while (z[p2] <= z[p1])
--p2;
std::swap(z[p1], z[p2]);
std::reverse(z.begin() + p1 + 1, z.end());
}
}
int main() {
std::vector<int> z = {1, 2, 3, 4, 5, 6, 7};
int m = 3;
int n = z.size();
const int nMinusK = n - m;
int numPerms = 1;
for (int i = n; i > nMinusK; --i)
numPerms *= i;
--numPerms;
for (int i = 0; i < numPerms; ++i) {
for (int j = 0; j < m; ++j)
std::cout << z[j] << ' ';
std::cout << std::endl;
nextPartialPerm(z, n - 1, m - 1);
}
// Print last permutation
for (int j = 0; j < m; ++j)
std::cout << z[j] << ' ';
std::cout << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgoKdm9pZCBuZXh0UGFydGlhbFBlcm0oc3RkOjp2ZWN0b3I8aW50PiAmeiwgaW50IG4xLCBpbnQgbTEpIHsKICAgIAogICAgaW50IHAxID0gbTEgKyAxOwogICAgCiAgICB3aGlsZSAocDEgPD0gbjEgJiYgelttMV0gPj0geltwMV0pCiAgICAgICAgKytwMTsKICAgIAogICAgaWYgKHAxIDw9IG4xKSB7CiAgICAgICAgc3RkOjpzd2FwKHpbcDFdLCB6W20xXSk7CiAgICB9IGVsc2UgewogICAgICAgIHN0ZDo6cmV2ZXJzZSh6LmJlZ2luKCkgKyBtMSArIDEsIHouZW5kKCkpOwogICAgICAgIHAxID0gbTE7CiAgICAgICAgCiAgICAgICAgd2hpbGUgKHpbcDEgKyAxXSA8PSB6W3AxXSkKICAgICAgICAgICAgLS1wMTsKICAgICAgICAKICAgICAgICBpbnQgcDIgPSBuMTsKICAgICAgICAKICAgICAgICB3aGlsZSAoeltwMl0gPD0geltwMV0pCiAgICAgICAgICAgIC0tcDI7CiAgICAgICAgCiAgICAgICAgc3RkOjpzd2FwKHpbcDFdLCB6W3AyXSk7CiAgICAgICAgc3RkOjpyZXZlcnNlKHouYmVnaW4oKSArIHAxICsgMSwgei5lbmQoKSk7CiAgICB9Cn0KCmludCBtYWluKCkgewogICAgc3RkOjp2ZWN0b3I8aW50PiB6ID0gezEsIDIsIDMsIDQsIDUsIDYsIDd9OwogICAgaW50IG0gPSAzOwogICAgaW50IG4gPSB6LnNpemUoKTsKICAgIAogICAgY29uc3QgaW50IG5NaW51c0sgPSBuIC0gbTsKICAgIGludCBudW1QZXJtcyA9IDE7CiAgICAKICAgIGZvciAoaW50IGkgPSBuOyBpID4gbk1pbnVzSzsgLS1pKQogICAgICAgIG51bVBlcm1zICo9IGk7CiAgICAKICAgIC0tbnVtUGVybXM7CiAgICAKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtUGVybXM7ICsraSkgewogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbTsgKytqKQogICAgICAgICAgICBzdGQ6OmNvdXQgPDwgeltqXSA8PCAnICc7CiAgICAgICAgCiAgICAgICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKICAgICAgICBuZXh0UGFydGlhbFBlcm0oeiwgbiAtIDEsIG0gLSAxKTsKICAgIH0KICAgIAogICAgLy8gUHJpbnQgbGFzdCBwZXJtdXRhdGlvbgogICAgZm9yIChpbnQgaiA9IDA7IGogPCBtOyArK2opCiAgICAgICAgICAgIHN0ZDo6Y291dCA8PCB6W2pdIDw8ICcgJzsKICAgICAgICAKICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7CiAgICAKICAgIHJldHVybiAwOwp9