#include <algorithm>
#include <cassert>
#include <iostream>
#include <iterator>
#include <vector>
using namespace std;
template < class BidirectionalIterator >
bool next_combination(BidirectionalIterator first1,
BidirectionalIterator last1,
BidirectionalIterator first2,
BidirectionalIterator last2)
{
if ((first1 == last1) || (first2 == last2)) {
return false;
}
BidirectionalIterator m1 = last1;
BidirectionalIterator m2 = last2; --m2;
while (--m1 != first1 && !(*m1 < *m2)) {
}
bool result = (m1 == first1) && !(*first1 < *m2);
if (!result) {
while (first2 != m2 && !(*m1 < *first2)) {
++first2;
}
first1 = m1;
std::iter_swap(first1, first2);
++first1;
++first2;
}
if ((first1 != last1) && (first2 != last2)) {
m1 = last1; m2 = first2;
while ((m1 != first1) && (m2 != last2)) {
std::iter_swap(--m1, m2);
++m2;
}
std::reverse(first1, m1);
std::reverse(first1, last1);
std::reverse(m2, last2);
std::reverse(first2, last2);
}
return !result;
}
template < class BidirectionalIterator >
bool next_combination(BidirectionalIterator first,
BidirectionalIterator middle,
BidirectionalIterator last)
{
return next_combination(first, middle, middle, last);
}
int main() {
vector<unsigned int> row{ 40, 40, 40, 50, 50, 60, 100 };
vector<unsigned int>::iterator it = next(row.begin(), 3);
do {
copy(row.begin(), it, ostream_iterator<unsigned int>(cout, " "));
cout << endl;
} while(next_combination(row.begin(), it, row.end()));
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGNhc3NlcnQ+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGl0ZXJhdG9yPgojaW5jbHVkZSA8dmVjdG9yPgogCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0ZW1wbGF0ZSA8IGNsYXNzIEJpZGlyZWN0aW9uYWxJdGVyYXRvciA+CmJvb2wgbmV4dF9jb21iaW5hdGlvbihCaWRpcmVjdGlvbmFsSXRlcmF0b3IgZmlyc3QxLAoJQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIGxhc3QxLAoJQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIGZpcnN0MiwKCUJpZGlyZWN0aW9uYWxJdGVyYXRvciBsYXN0MikKewoJaWYgKChmaXJzdDEgPT0gbGFzdDEpIHx8IChmaXJzdDIgPT0gbGFzdDIpKSB7CgkJcmV0dXJuIGZhbHNlOwoJfQoJQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIG0xID0gbGFzdDE7CglCaWRpcmVjdGlvbmFsSXRlcmF0b3IgbTIgPSBsYXN0MjsgLS1tMjsKCXdoaWxlICgtLW0xICE9IGZpcnN0MSAmJiAhKCptMSA8ICptMikpIHsKCX0KCWJvb2wgcmVzdWx0ID0gKG0xID09IGZpcnN0MSkgJiYgISgqZmlyc3QxIDwgKm0yKTsKCWlmICghcmVzdWx0KSB7CgkJd2hpbGUgKGZpcnN0MiAhPSBtMiAmJiAhKCptMSA8ICpmaXJzdDIpKSB7CgkJCSsrZmlyc3QyOwoJCX0KCQlmaXJzdDEgPSBtMTsKCQlzdGQ6Oml0ZXJfc3dhcChmaXJzdDEsIGZpcnN0Mik7CgkJKytmaXJzdDE7CgkJKytmaXJzdDI7Cgl9CglpZiAoKGZpcnN0MSAhPSBsYXN0MSkgJiYgKGZpcnN0MiAhPSBsYXN0MikpIHsKCQltMSA9IGxhc3QxOyBtMiA9IGZpcnN0MjsKCQl3aGlsZSAoKG0xICE9IGZpcnN0MSkgJiYgKG0yICE9IGxhc3QyKSkgewoJCQlzdGQ6Oml0ZXJfc3dhcCgtLW0xLCBtMik7CgkJCSsrbTI7CgkJfQoJCXN0ZDo6cmV2ZXJzZShmaXJzdDEsIG0xKTsKCQlzdGQ6OnJldmVyc2UoZmlyc3QxLCBsYXN0MSk7CgkJc3RkOjpyZXZlcnNlKG0yLCBsYXN0Mik7CgkJc3RkOjpyZXZlcnNlKGZpcnN0MiwgbGFzdDIpOwoJfQoJcmV0dXJuICFyZXN1bHQ7Cn0KCnRlbXBsYXRlIDwgY2xhc3MgQmlkaXJlY3Rpb25hbEl0ZXJhdG9yID4KYm9vbCBuZXh0X2NvbWJpbmF0aW9uKEJpZGlyZWN0aW9uYWxJdGVyYXRvciBmaXJzdCwKCUJpZGlyZWN0aW9uYWxJdGVyYXRvciBtaWRkbGUsCglCaWRpcmVjdGlvbmFsSXRlcmF0b3IgbGFzdCkKewoJcmV0dXJuIG5leHRfY29tYmluYXRpb24oZmlyc3QsIG1pZGRsZSwgbWlkZGxlLCBsYXN0KTsKfQoKaW50IG1haW4oKSB7Cgl2ZWN0b3I8dW5zaWduZWQgaW50PiByb3d7IDQwLCA0MCwgNDAsIDUwLCA1MCwgNjAsIDEwMCB9OwoJdmVjdG9yPHVuc2lnbmVkIGludD46Oml0ZXJhdG9yIGl0ID0gbmV4dChyb3cuYmVnaW4oKSwgMyk7CgoJZG8gewoJCWNvcHkocm93LmJlZ2luKCksIGl0LCBvc3RyZWFtX2l0ZXJhdG9yPHVuc2lnbmVkIGludD4oY291dCwgIiAiKSk7CgkJY291dCA8PCBlbmRsOwoJfSB3aGlsZShuZXh0X2NvbWJpbmF0aW9uKHJvdy5iZWdpbigpLCBpdCwgcm93LmVuZCgpKSk7Cn0=