#include <iostream>
#include <vector>
#include <queue>
int main()
{
using szvec = std::vector<size_t>;
using range = std::pair<szvec::const_iterator,szvec::const_iterator>;
const std::vector<szvec> v = {
{4, 10, 12, 18, 20, 28, 34},
{4, 12, 18, 20, 28},
{4, 17, 18, 20, 28},
{4, 17, 18, 20, 28, 37}
};
// we use greater so iterator with smallest value will be on top of queue
auto sort_range = []( const range &r1, const range &r2 ) {
return *(r1.first) > *(r2.first);
};
std::priority_queue<range,std::vector<range>,decltype(sort_range)> q( sort_range );
for( const auto &vec : v ) q.push( std::make_pair( vec.cbegin(), vec.cend() ) );
std::vector<std::pair<size_t,size_t>> counters;
while( !q.empty() ) {
auto r = q.top();
q.pop();
if( counters.empty() || counters.back().first != *(r.first) )
counters.emplace_back( *(r.first), 1 );
else
counters.back().second++;
if( ++r.first != r.second ) q.push( r );
}
for( const auto &p : counters )
std::cout << p.first << ":" << p.second << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8cXVldWU+CgppbnQgbWFpbigpCnsKCXVzaW5nIHN6dmVjID0gc3RkOjp2ZWN0b3I8c2l6ZV90PjsKCXVzaW5nIHJhbmdlID0gc3RkOjpwYWlyPHN6dmVjOjpjb25zdF9pdGVyYXRvcixzenZlYzo6Y29uc3RfaXRlcmF0b3I+OwoKICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN6dmVjPiB2ID0gewogICAgICAgIHs0LCAxMCwgMTIsIDE4LCAyMCwgMjgsIDM0fSwKICAgICAgICB7NCwgMTIsIDE4LCAyMCwgMjh9LAogICAgICAgIHs0LCAxNywgMTgsIDIwLCAyOH0sCiAgICAgICAgezQsIDE3LCAxOCwgMjAsIDI4LCAzN30KICAgIH07CiAgICAKICAgIC8vIHdlIHVzZSBncmVhdGVyIHNvIGl0ZXJhdG9yIHdpdGggc21hbGxlc3QgdmFsdWUgd2lsbCBiZSBvbiB0b3Agb2YgcXVldWUKICAgIGF1dG8gc29ydF9yYW5nZSA9IFtdKCBjb25zdCByYW5nZSAmcjEsIGNvbnN0IHJhbmdlICZyMiApIHsgCiAgICAJcmV0dXJuICoocjEuZmlyc3QpID4gKihyMi5maXJzdCk7CiAgICB9OwogICAgc3RkOjpwcmlvcml0eV9xdWV1ZTxyYW5nZSxzdGQ6OnZlY3RvcjxyYW5nZT4sZGVjbHR5cGUoc29ydF9yYW5nZSk+IHEoIHNvcnRfcmFuZ2UgKTsKICAgIAogICAgZm9yKCBjb25zdCBhdXRvICZ2ZWMgOiB2ICkgcS5wdXNoKCBzdGQ6Om1ha2VfcGFpciggdmVjLmNiZWdpbigpLCB2ZWMuY2VuZCgpICkgKTsKICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzaXplX3Qsc2l6ZV90Pj4gY291bnRlcnM7CiAgICB3aGlsZSggIXEuZW1wdHkoKSApIHsKICAgICAgICBhdXRvIHIgPSBxLnRvcCgpOwogICAgICAgIHEucG9wKCk7CiAgICAgICAgaWYoIGNvdW50ZXJzLmVtcHR5KCkgfHwgY291bnRlcnMuYmFjaygpLmZpcnN0ICE9ICooci5maXJzdCkgKSAKICAgICAgICAgICAgY291bnRlcnMuZW1wbGFjZV9iYWNrKCAqKHIuZmlyc3QpLCAxICk7CiAgICAgICAgZWxzZSAKICAgICAgICAgICAgY291bnRlcnMuYmFjaygpLnNlY29uZCsrOwogICAgICAgIGlmKCArK3IuZmlyc3QgIT0gci5zZWNvbmQgKSBxLnB1c2goIHIgKTsKICAgIH0KICAgIAogICAgZm9yKCBjb25zdCBhdXRvICZwIDogY291bnRlcnMgKSAKICAgICAgICBzdGQ6OmNvdXQgPDwgcC5maXJzdCA8PCAiOiIgPDwgcC5zZWNvbmQgPDwgc3RkOjplbmRsOwp9Cg==