#include <algorithm>
#include <iostream>
#include <vector>
template <typename T, typename F>
void BreadthFirstCombination(const std::vector<T>& v, F f)
{
for (int i = 0; i != v.size() + 1; ++i) {
std::vector<bool> mask(i, true);
mask.resize(v.size(), false);
do {
f(v, mask);
} while (std::prev_permutation(mask.begin(), mask.end()));
}
}
int main() {
auto printer = [](const auto&v, const std::vector<bool>& mask)
{
for (std::size_t i = 0; i != v.size(); ++i) {
if (mask[i]) {
std::cout << v[i] << " ";
}
}
std::cout << std::endl;
};
std::vector<int> v = {1, 2, 4};
BreadthFirstCombination(v, printer);
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEY+CnZvaWQgQnJlYWR0aEZpcnN0Q29tYmluYXRpb24oY29uc3Qgc3RkOjp2ZWN0b3I8VD4mIHYsIEYgZikKewogICAgZm9yIChpbnQgaSA9IDA7IGkgIT0gdi5zaXplKCkgKyAxOyArK2kpIHsKICAgICAgICBzdGQ6OnZlY3Rvcjxib29sPiBtYXNrKGksIHRydWUpOwogICAgICAgIG1hc2sucmVzaXplKHYuc2l6ZSgpLCBmYWxzZSk7CiAgICAgICAgZG8gewogICAgICAgICAgICBmKHYsIG1hc2spOwogICAgICAgIH0gd2hpbGUgKHN0ZDo6cHJldl9wZXJtdXRhdGlvbihtYXNrLmJlZ2luKCksIG1hc2suZW5kKCkpKTsKICAgIH0KfQoKaW50IG1haW4oKSB7CiAgICAKICAgIGF1dG8gcHJpbnRlciA9IFtdKGNvbnN0IGF1dG8mdiwgY29uc3Qgc3RkOjp2ZWN0b3I8Ym9vbD4mIG1hc2spCiAgICB7CiAgICAgICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSAhPSB2LnNpemUoKTsgKytpKSB7CiAgICAgICAgICAgIGlmIChtYXNrW2ldKSB7CiAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgdltpXSA8PCAiICI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsgICAgCiAgICB9OwogICAgc3RkOjp2ZWN0b3I8aW50PiB2ID0gezEsIDIsIDR9OwogICAgQnJlYWR0aEZpcnN0Q29tYmluYXRpb24odiwgcHJpbnRlcik7Cn0K