#include <iterator>
template<class it, class mather=std::plus<typename std::iterator_traits<it>::value_type> >
bool next_increasing(it start, it end, typename std::iterator_traits<it>::value_type limit, mather plus={}) {
bool n = true;
it c = std::prev(end);
*c = plus(*c, 1);
if (*c == limit) {
if (c == start)
return false;
n = next_increasing<it>(start, c, plus(limit,-1));
it prev = std::prev(c);
*c = plus(*prev,1);
}
return n;
}
template<class it, class mather=std::plus<typename std::iterator_traits<it>::value_type> >
bool next_increasing_eq(it start, it end, typename std::iterator_traits<it>::value_type limit, mather plus={}) {
bool n = true;
it c = std::prev(end);
*c = plus(*c, 1);
if (*c == limit) {
if (c == start)
return false;
n = next_increasing_eq<it>(start, c, limit);
it prev = std::prev(c);
*c = *prev;
}
return n;
}
#include <iostream>
int main() {
int data[5] = {0,1,2,3,4};
do {
std::cout << data[0]<<data[1]<<data[2]<<data[3]<<data[4]<<'\n';
}while(next_increasing(data+0,data+5,10));
}
I2luY2x1ZGUgPGl0ZXJhdG9yPgoKdGVtcGxhdGU8Y2xhc3MgaXQsIGNsYXNzIG1hdGhlcj1zdGQ6OnBsdXM8dHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8aXQ+Ojp2YWx1ZV90eXBlPiA+CmJvb2wgbmV4dF9pbmNyZWFzaW5nKGl0IHN0YXJ0LCBpdCBlbmQsIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPGl0Pjo6dmFsdWVfdHlwZSBsaW1pdCwgbWF0aGVyIHBsdXM9e30pIHsKICAgIGJvb2wgbiA9IHRydWU7CiAgICBpdCBjID0gc3RkOjpwcmV2KGVuZCk7CiAgICAqYyA9IHBsdXMoKmMsIDEpOwogICAgaWYgKCpjID09IGxpbWl0KSB7CiAgICAgICAgaWYgKGMgPT0gc3RhcnQpCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICBuID0gbmV4dF9pbmNyZWFzaW5nPGl0PihzdGFydCwgYywgcGx1cyhsaW1pdCwtMSkpOwogICAgICAgIGl0IHByZXYgPSBzdGQ6OnByZXYoYyk7CiAgICAgICAgKmMgPSBwbHVzKCpwcmV2LDEpOwogICAgfQogICAgcmV0dXJuIG47Cn0KdGVtcGxhdGU8Y2xhc3MgaXQsIGNsYXNzIG1hdGhlcj1zdGQ6OnBsdXM8dHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8aXQ+Ojp2YWx1ZV90eXBlPiA+CmJvb2wgbmV4dF9pbmNyZWFzaW5nX2VxKGl0IHN0YXJ0LCBpdCBlbmQsIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPGl0Pjo6dmFsdWVfdHlwZSBsaW1pdCwgbWF0aGVyIHBsdXM9e30pIHsKICAgIGJvb2wgbiA9IHRydWU7CiAgICBpdCBjID0gc3RkOjpwcmV2KGVuZCk7CiAgICAqYyA9IHBsdXMoKmMsIDEpOwogICAgaWYgKCpjID09IGxpbWl0KSB7CiAgICAgICAgaWYgKGMgPT0gc3RhcnQpCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICBuID0gbmV4dF9pbmNyZWFzaW5nX2VxPGl0PihzdGFydCwgYywgbGltaXQpOwogICAgICAgIGl0IHByZXYgPSBzdGQ6OnByZXYoYyk7CiAgICAgICAgKmMgPSAqcHJldjsKICAgIH0KICAgIHJldHVybiBuOwp9CgojaW5jbHVkZSA8aW9zdHJlYW0+CgppbnQgbWFpbigpIHsKCWludCBkYXRhWzVdID0gezAsMSwyLDMsNH07CglkbyB7CgkJc3RkOjpjb3V0IDw8IGRhdGFbMF08PGRhdGFbMV08PGRhdGFbMl08PGRhdGFbM108PGRhdGFbNF08PCdcbic7Cgl9d2hpbGUobmV4dF9pbmNyZWFzaW5nKGRhdGErMCxkYXRhKzUsMTApKTsKfQ==