#include <string>
#include <iostream>
#include <set>
#include <vector>
bool increase(const std::vector<std::set<int>>& v, std::vector<std::set<int>::iterator>& it)
{
for (std::size_t i = 0, size = it.size(); i != size; ++i) {
const std::size_t index = size - 1 - i;
++it[index];
if (it[index] == v[index].end()) {
it[index] = v[index].begin();
} else {
return true;
}
}
return false;
}
template <typename F>
void iterate(const std::vector<std::set<int>>& v, F&& do_job)
{
std::vector<std::set<int>::iterator> its;
its.reserve(v.size());
for (auto& s : v) {
its.push_back(s.begin());
}
do {
do_job(its);
} while (increase(v, its));
}
int main()
{
std::vector<std::set<int>> v{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
iterate(v, [](const std::vector<std::set<int>::iterator>& its)
{
for (auto it : its) {
std::cout << *it << " ";
}
std::cout << std::endl;
});
}
I2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c2V0PgojaW5jbHVkZSA8dmVjdG9yPgoKCmJvb2wgaW5jcmVhc2UoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzZXQ8aW50Pj4mIHYsIHN0ZDo6dmVjdG9yPHN0ZDo6c2V0PGludD46Oml0ZXJhdG9yPiYgaXQpCnsKICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDAsIHNpemUgPSBpdC5zaXplKCk7IGkgIT0gc2l6ZTsgKytpKSB7CiAgICAgICAgY29uc3Qgc3RkOjpzaXplX3QgaW5kZXggPSBzaXplIC0gMSAtIGk7CiAgICAgICAgKytpdFtpbmRleF07CiAgICAgICAgaWYgKGl0W2luZGV4XSA9PSB2W2luZGV4XS5lbmQoKSkgewogICAgICAgICAgICBpdFtpbmRleF0gPSB2W2luZGV4XS5iZWdpbigpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIEY+CnZvaWQgaXRlcmF0ZShjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNldDxpbnQ+PiYgdiwgRiYmIGRvX2pvYikKewogICAgc3RkOjp2ZWN0b3I8c3RkOjpzZXQ8aW50Pjo6aXRlcmF0b3I+IGl0czsKICAgIGl0cy5yZXNlcnZlKHYuc2l6ZSgpKTsKICAgIGZvciAoYXV0byYgcyA6IHYpIHsKICAgICAgICBpdHMucHVzaF9iYWNrKHMuYmVnaW4oKSk7CiAgICB9CgogICAgZG8gewogICAgICAgIGRvX2pvYihpdHMpOwogICAgfSB3aGlsZSAoaW5jcmVhc2UodiwgaXRzKSk7Cn0KCmludCBtYWluKCkKewogICAgc3RkOjp2ZWN0b3I8c3RkOjpzZXQ8aW50Pj4gdnt7MSwgMiwgM30sIHs0LCA1LCA2fSwgezcsIDgsIDl9fTsKCiAgICBpdGVyYXRlKHYsIFtdKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2V0PGludD46Oml0ZXJhdG9yPiYgaXRzKQogICAgewogICAgICAgIGZvciAoYXV0byBpdCA6IGl0cykgewogICAgICAgICAgICBzdGQ6OmNvdXQgPDwgKml0IDw8ICIgIjsgICAKICAgICAgICB9CiAgICAgICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKICAgIH0pOwp9Cg==