#include <string>
#include <iostream>
#include <vector>
std::vector<std::size_t> initialize(std::size_t depth)
{
std::vector<std::size_t> res(depth - 1);
int i = 1;
for (auto& e : res) {
e = i;
i += 2;
}
return res;
}
bool increase(std::vector<std::size_t>& indexes, std::size_t max)
{
auto m = max;
auto rit = indexes.rbegin();
for (; rit != indexes.rend(); ++rit) {
++*rit;
if (*rit + 1 != m) {
m = *rit;
for (auto it = rit.base(); it != indexes.end(); ++it) {
*it = m + 2;
m += 2;
}
if (m < max) {
return true;
}
}
m = *rit - 1;
}
return false;
}
template <typename V>
void print(const V& v, std::size_t last)
{
auto prev = 0;
for (const auto& e : v) {
std::cout << prev << "-" << e << " ";
prev = e + 1;
}
std::cout << v.back() + 1 << "-" << last;
std::cout << std::endl;
}
int main()
{
auto v = initialize(3);
const auto size = 6;
do
{
print(v, size);
} while (increase(v, size));
}
I2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKc3RkOjp2ZWN0b3I8c3RkOjpzaXplX3Q+IGluaXRpYWxpemUoc3RkOjpzaXplX3QgZGVwdGgpCnsKICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2l6ZV90PiByZXMoZGVwdGggLSAxKTsKICAgIAogICAgaW50IGkgPSAxOwogICAgZm9yIChhdXRvJiBlIDogcmVzKSB7CiAgICAgICAgZSA9IGk7CiAgICAgICAgaSArPSAyOwogICAgfQogICAgcmV0dXJuIHJlczsKfQoKYm9vbCBpbmNyZWFzZShzdGQ6OnZlY3RvcjxzdGQ6OnNpemVfdD4mIGluZGV4ZXMsIHN0ZDo6c2l6ZV90IG1heCkKewogICAgYXV0byBtID0gbWF4OwogICAgYXV0byByaXQgPSBpbmRleGVzLnJiZWdpbigpOwogICAgZm9yICg7IHJpdCAhPSBpbmRleGVzLnJlbmQoKTsgKytyaXQpIHsKICAgICAgICArKypyaXQ7CiAgICAgICAgaWYgKCpyaXQgKyAxICE9IG0pIHsKICAgICAgICAgICAgbSA9ICpyaXQ7CiAgICAgICAgICAgIGZvciAoYXV0byBpdCA9IHJpdC5iYXNlKCk7IGl0ICE9IGluZGV4ZXMuZW5kKCk7ICsraXQpIHsKICAgICAgICAgICAgICAgICppdCA9IG0gKyAyOwogICAgICAgICAgICAgICAgbSArPSAyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChtIDwgbWF4KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBtID0gKnJpdCAtIDE7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7Cn0KCgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVj4Kdm9pZCBwcmludChjb25zdCBWJiB2LCBzdGQ6OnNpemVfdCBsYXN0KQp7CiAgICBhdXRvIHByZXYgPSAwOwogICAgZm9yIChjb25zdCBhdXRvJiBlIDogdikgewogICAgICAgIHN0ZDo6Y291dCA8PCBwcmV2IDw8ICItIiA8PCBlIDw8ICIgIjsKICAgICAgICBwcmV2ID0gZSArIDE7CiAgICB9CiAgICBzdGQ6OmNvdXQgPDwgdi5iYWNrKCkgKyAxIDw8ICItIiA8PCBsYXN0OwogICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKfQoKCmludCBtYWluKCkKewogICAgYXV0byB2ID0gaW5pdGlhbGl6ZSgzKTsKICAgIGNvbnN0IGF1dG8gc2l6ZSA9IDY7CgogICAgZG8KICAgIHsKICAgICAgICBwcmludCh2LCBzaXplKTsKICAgIH0gd2hpbGUgKGluY3JlYXNlKHYsIHNpemUpKTsKfQ==