#include <vector>
#include <queue>
#include <iostream>
template<
class InIts,
typename OutIt,
class Cmp=std::less<typename std::iterator_traits<typename InIts::value_type::first_type>::value_type>>
OutIt merge(const InIts &in_its, OutIt out_it, Cmp cmp=Cmp())
{
using it_t = typename InIts::value_type::first_type;
using pair_t = std::pair<it_t, std::size_t>;
auto pair_cmp = [cmp](const pair_t &lhs, const pair_t &rhs) { return !cmp(*lhs.first, *rhs.first); };
using q_t = std::priority_queue<pair_t, std::vector<pair_t>, decltype(pair_cmp)>;
std::vector<std::pair<it_t, it_t>> origs{in_its};
std::cout << origs.size() << std::endl;
q_t q{pair_cmp};
for(std::size_t i = 0; i < origs.size(); ++i)
{
auto &p = origs[i];
if(p.first != p.second)
q.push(std::make_pair(p.first, i));
}
while(!q.empty())
{
auto t = q.top();
*(out_it++) = *t.first;
const auto i = t.second;
q.pop();
auto &p = origs[i];
if(++p.first != p.second)
q.push(std::make_pair(p.first, i));
}
return out_it;
}
int main()
{
using vec_t = std::vector<int>;
vec_t v0{1, 2, 3};
vec_t v1{2, 3, 4};
vec_t v2{4, 5, 6};
using vec_it_t = vec_t::iterator;
std::vector<std::pair<vec_it_t, vec_it_t>> its{
std::make_pair(std::begin(v0), std::end(v0)),
std::make_pair(std::begin(v1), std::end(v1)),
std::make_pair(std::begin(v2), std::end(v2))};
vec_t res;
merge(its, std::back_inserter(res));
for(auto &e: res)
std::cout << e << std::endl;
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPHF1ZXVlPgojaW5jbHVkZSA8aW9zdHJlYW0+CgoKdGVtcGxhdGU8CiAgICBjbGFzcyBJbkl0cywgCiAgICB0eXBlbmFtZSBPdXRJdCwKICAgIGNsYXNzIENtcD1zdGQ6Omxlc3M8dHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8dHlwZW5hbWUgSW5JdHM6OnZhbHVlX3R5cGU6OmZpcnN0X3R5cGU+Ojp2YWx1ZV90eXBlPj4KT3V0SXQgbWVyZ2UoY29uc3QgSW5JdHMgJmluX2l0cywgT3V0SXQgb3V0X2l0LCBDbXAgY21wPUNtcCgpKQp7CiAgICB1c2luZyBpdF90ID0gdHlwZW5hbWUgSW5JdHM6OnZhbHVlX3R5cGU6OmZpcnN0X3R5cGU7CiAgICB1c2luZyBwYWlyX3QgPSBzdGQ6OnBhaXI8aXRfdCwgc3RkOjpzaXplX3Q+OwogICAgYXV0byBwYWlyX2NtcCA9IFtjbXBdKGNvbnN0IHBhaXJfdCAmbGhzLCBjb25zdCBwYWlyX3QgJnJocykgeyByZXR1cm4gIWNtcCgqbGhzLmZpcnN0LCAqcmhzLmZpcnN0KTsgfTsKICAgIHVzaW5nIHFfdCA9IHN0ZDo6cHJpb3JpdHlfcXVldWU8cGFpcl90LCBzdGQ6OnZlY3RvcjxwYWlyX3Q+LCBkZWNsdHlwZShwYWlyX2NtcCk+OwoKICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpdF90LCBpdF90Pj4gb3JpZ3N7aW5faXRzfTsKICAgIHN0ZDo6Y291dCA8PCBvcmlncy5zaXplKCkgPDwgc3RkOjplbmRsOwogICAgcV90IHF7cGFpcl9jbXB9OwoKICAgIGZvcihzdGQ6OnNpemVfdCBpID0gMDsgaSA8IG9yaWdzLnNpemUoKTsgKytpKQogICAgeyAgIAogICAgICAgIGF1dG8gJnAgPSBvcmlnc1tpXTsKICAgICAgICBpZihwLmZpcnN0ICE9IHAuc2Vjb25kKSAKICAgICAgICAgICAgcS5wdXNoKHN0ZDo6bWFrZV9wYWlyKHAuZmlyc3QsIGkpKTsKICAgIH0KCiAgICB3aGlsZSghcS5lbXB0eSgpKSAKICAgIHsKICAgICAgICBhdXRvIHQgPSBxLnRvcCgpOwogICAgICAgICoob3V0X2l0KyspID0gKnQuZmlyc3Q7CiAgICAgICAgY29uc3QgYXV0byBpID0gdC5zZWNvbmQ7CiAgICAgICAgcS5wb3AoKTsKCiAgICAgICAgYXV0byAmcCA9IG9yaWdzW2ldOwogICAgICAgIGlmKCsrcC5maXJzdCAhPSBwLnNlY29uZCkKICAgICAgICAgICAgcS5wdXNoKHN0ZDo6bWFrZV9wYWlyKHAuZmlyc3QsIGkpKTsKICAgIH0KICAKICAgIHJldHVybiBvdXRfaXQ7Cn0KCgppbnQgbWFpbigpCnsKICAgIHVzaW5nIHZlY190ID0gc3RkOjp2ZWN0b3I8aW50PjsKCiAgICB2ZWNfdCB2MHsxLCAyLCAzfTsgCiAgICB2ZWNfdCB2MXsyLCAzLCA0fTsgCiAgICB2ZWNfdCB2Mns0LCA1LCA2fTsgCgogICAgdXNpbmcgdmVjX2l0X3QgPSB2ZWNfdDo6aXRlcmF0b3I7CgogICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHZlY19pdF90LCB2ZWNfaXRfdD4+IGl0c3sKICAgICAgICBzdGQ6Om1ha2VfcGFpcihzdGQ6OmJlZ2luKHYwKSwgc3RkOjplbmQodjApKSwKICAgICAgICBzdGQ6Om1ha2VfcGFpcihzdGQ6OmJlZ2luKHYxKSwgc3RkOjplbmQodjEpKSwKICAgICAgICBzdGQ6Om1ha2VfcGFpcihzdGQ6OmJlZ2luKHYyKSwgc3RkOjplbmQodjIpKX07CgogICAgdmVjX3QgcmVzOwogICAgbWVyZ2UoaXRzLCBzdGQ6OmJhY2tfaW5zZXJ0ZXIocmVzKSk7CiAgICBmb3IoYXV0byAmZTogcmVzKQogICAgICAgIHN0ZDo6Y291dCA8PCBlIDw8IHN0ZDo6ZW5kbDsKfQogICAg