#include <algorithm>
#include <cassert>
#include <iostream>
#include <iterator>
#include <vector>
using namespace std;
template <typename InputIt, typename OutputIt>
bool next_combination(InputIt inFirst, InputIt inLast, OutputIt outFirst, OutputIt outLast) {
assert(distance(inFirst, inLast) >= distance(outFirst, outLast));
const auto front = make_reverse_iterator(outFirst);
const auto back = make_reverse_iterator(outLast);
auto it = mismatch(back, front, make_reverse_iterator(inLast)).first;
const auto result = it != front;
if (result) {
auto ub = upper_bound(inFirst, inLast, *it);
copy(ub, next(ub, distance(back, it) + 1), next(it).base());
}
return result;
}
int main() {
const vector<unsigned int> row{ 40, 40, 40, 50, 50, 60, 100 };
vector<unsigned int> it{ row.cbegin(), next(row.cbegin(), 3) };
do {
copy(it.cbegin(), it.cend(), ostream_iterator<unsigned int>(cout, " "));
cout << endl;
} while(next_combination(row.cbegin(), row.cend(), it.begin(), it.end()));
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGNhc3NlcnQ+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGl0ZXJhdG9yPgojaW5jbHVkZSA8dmVjdG9yPgogCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5wdXRJdCwgdHlwZW5hbWUgT3V0cHV0SXQ+CmJvb2wgbmV4dF9jb21iaW5hdGlvbihJbnB1dEl0IGluRmlyc3QsIElucHV0SXQgaW5MYXN0LCBPdXRwdXRJdCBvdXRGaXJzdCwgT3V0cHV0SXQgb3V0TGFzdCkgewoJYXNzZXJ0KGRpc3RhbmNlKGluRmlyc3QsIGluTGFzdCkgPj0gZGlzdGFuY2Uob3V0Rmlyc3QsIG91dExhc3QpKTsKCQoJY29uc3QgYXV0byBmcm9udCA9IG1ha2VfcmV2ZXJzZV9pdGVyYXRvcihvdXRGaXJzdCk7Cgljb25zdCBhdXRvIGJhY2sgPSBtYWtlX3JldmVyc2VfaXRlcmF0b3Iob3V0TGFzdCk7CglhdXRvIGl0ID0gbWlzbWF0Y2goYmFjaywgZnJvbnQsIG1ha2VfcmV2ZXJzZV9pdGVyYXRvcihpbkxhc3QpKS5maXJzdDsKCQoJY29uc3QgYXV0byByZXN1bHQgPSBpdCAhPSBmcm9udDsKCglpZiAocmVzdWx0KSB7CgkJYXV0byB1YiA9IHVwcGVyX2JvdW5kKGluRmlyc3QsIGluTGFzdCwgKml0KTsKCgkJY29weSh1YiwgbmV4dCh1YiwgZGlzdGFuY2UoYmFjaywgaXQpICsgMSksIG5leHQoaXQpLmJhc2UoKSk7Cgl9CglyZXR1cm4gcmVzdWx0Owp9CgppbnQgbWFpbigpIHsKCWNvbnN0IHZlY3Rvcjx1bnNpZ25lZCBpbnQ+IHJvd3sgNDAsIDQwLCA0MCwgNTAsIDUwLCA2MCwgMTAwIH07Cgl2ZWN0b3I8dW5zaWduZWQgaW50PiBpdHsgcm93LmNiZWdpbigpLCBuZXh0KHJvdy5jYmVnaW4oKSwgMykgfTsKCglkbyB7CgkJY29weShpdC5jYmVnaW4oKSwgaXQuY2VuZCgpLCBvc3RyZWFtX2l0ZXJhdG9yPHVuc2lnbmVkIGludD4oY291dCwgIiAiKSk7CgkJY291dCA8PCBlbmRsOwoJfSB3aGlsZShuZXh0X2NvbWJpbmF0aW9uKHJvdy5jYmVnaW4oKSwgcm93LmNlbmQoKSwgaXQuYmVnaW4oKSwgaXQuZW5kKCkpKTsKfQ==