#include <iostream>
#include <vector>
template <typename T>
bool increase(const std::vector<std::vector<T>>& v, std::vector<std::size_t>& 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].size()) {
it[index] = 0;
} else {
return true;
}
}
return false;
}
template <typename T>
void do_job(const std::vector<std::vector<T>>& v, std::vector<std::size_t>& it)
{
for (std::size_t i = 0, size = v.size(); i != size; ++i) {
std::cout << v[i][it[i]] << " ";
}
std::cout << std::endl;
}
template <typename T>
void iterate(const std::vector<std::vector<T>>& v)
{
std::vector<std::size_t> it(v.size(), 0);
do {
do_job(v, it);
} while (increase(v, it));
}
int main(int argc, char *argv[])
{
std::vector<std::vector<int>> v = {
{0, 1, 2, 3, 4, 5},
{0, 1, 2, 3, 4, 5},
{0, 1, 2, 3, 4, 5}
};
iterate(v);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CmJvb2wgaW5jcmVhc2UoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8VD4+JiB2LCBzdGQ6OnZlY3RvcjxzdGQ6OnNpemVfdD4mIGl0KQp7CiAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwLCBzaXplID0gaXQuc2l6ZSgpOyBpICE9IHNpemU7ICsraSkgewogICAgICAgIGNvbnN0IHN0ZDo6c2l6ZV90IGluZGV4ID0gc2l6ZSAtIDEgLSBpOwogICAgICAgICsraXRbaW5kZXhdOwogICAgICAgIGlmIChpdFtpbmRleF0gPT0gdltpbmRleF0uc2l6ZSgpKSB7CiAgICAgICAgICAgIGl0W2luZGV4XSA9IDA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kdm9pZCBkb19qb2IoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8VD4+JiB2LCBzdGQ6OnZlY3RvcjxzdGQ6OnNpemVfdD4mIGl0KQp7CiAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwLCBzaXplID0gdi5zaXplKCk7IGkgIT0gc2l6ZTsgKytpKSB7CiAgICAgICAgc3RkOjpjb3V0IDw8IHZbaV1baXRbaV1dIDw8ICIgIjsKICAgIH0KICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgp2b2lkIGl0ZXJhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8VD4+JiB2KQp7CiAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNpemVfdD4gaXQodi5zaXplKCksIDApOwoKICAgIGRvIHsKICAgICAgICBkb19qb2IodiwgaXQpOwogICAgfSB3aGlsZSAoaW5jcmVhc2UodiwgaXQpKTsKfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKewogICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8aW50Pj4gdiA9IHsKICAgICAgICB7MCwgMSwgMiwgMywgNCwgNX0sCiAgICAgICAgezAsIDEsIDIsIDMsIDQsIDV9LAogICAgICAgIHswLCAxLCAyLCAzLCA0LCA1fQogICAgfTsKCiAgICBpdGVyYXRlKHYpOwogICAgcmV0dXJuIDA7Cn0K