#include <iostream>
#include <iterator>
#include <algorithm>
#include <functional>
#include <utility>
#include <vector>
#include <cstdlib>
#include <ctime>
template<
typename InputIterator
, typename OutputIterator
, typename Compare = std::less<typename std::iterator_traits<InputIterator>::value_type>
>
OutputIterator
merge(std::vector<std::pair<InputIterator, InputIterator>> input, OutputIterator output, Compare const compare = Compare()) {
using input_range = std::pair<InputIterator, InputIterator>;
auto const range_less = [=] (input_range lhs, input_range rhs) {
return compare(*lhs.first, *rhs.first);
};
auto const range_empty = [] (input_range range) {
return range.first == range.second;
};
input.erase(std::remove_if(std::begin(input), std::end(input), range_empty), std::end(input));
while (!input.empty()) {
auto const min = std::min_element(std::begin(input), std::end(input), range_less);
*output++ = *min->first++;
if (range_empty(*min)) {
input.erase(min);
}
}
return output;
}
int main() {
std::size_t const height = 10;
std::size_t const width = 10;
int matrix[height][width];
int array[height * width];
std::srand(std::time(nullptr));
for (auto & row : matrix) {
std::generate(std::begin(row), std::end(row), [] () { return std::rand() % 1000; });
std::sort(std::begin(row), std::end(row));
}
std::cout << "before merge" << std::endl;
for (auto const& row : matrix) {
std::copy(std::begin(row), std::end(row), std::ostream_iterator<int>{std::cout, "\t"});
std::cout << std::endl;
}
std::vector<std::pair<int *, int *>> rows(height);
for (std::size_t i = 0; i != height; ++i) {
rows[i] = {std::begin(matrix[i]), std::end(matrix[i])};
}
merge(rows, array);
std::cout << "after merge" << std::endl;
std::copy(std::begin(array), std::end(array), std::ostream_iterator<int>{std::cout, "\t"});
std::cout << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aXRlcmF0b3I+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxmdW5jdGlvbmFsPgojaW5jbHVkZSA8dXRpbGl0eT4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGNzdGRsaWI+CiNpbmNsdWRlIDxjdGltZT4KCgp0ZW1wbGF0ZTwKICAgICAgdHlwZW5hbWUgSW5wdXRJdGVyYXRvcgogICAgLCB0eXBlbmFtZSBPdXRwdXRJdGVyYXRvcgogICAgLCB0eXBlbmFtZSBDb21wYXJlID0gc3RkOjpsZXNzPHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPElucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlPgo+Ck91dHB1dEl0ZXJhdG9yCm1lcmdlKHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxJbnB1dEl0ZXJhdG9yLCBJbnB1dEl0ZXJhdG9yPj4gaW5wdXQsIE91dHB1dEl0ZXJhdG9yIG91dHB1dCwgQ29tcGFyZSBjb25zdCBjb21wYXJlID0gQ29tcGFyZSgpKSB7CiAgIHVzaW5nIGlucHV0X3JhbmdlID0gc3RkOjpwYWlyPElucHV0SXRlcmF0b3IsIElucHV0SXRlcmF0b3I+OwkKICAgCiAgIGF1dG8gY29uc3QgcmFuZ2VfbGVzcyA9IFs9XSAoaW5wdXRfcmFuZ2UgbGhzLCBpbnB1dF9yYW5nZSByaHMpIHsKICAgCSAgcmV0dXJuIGNvbXBhcmUoKmxocy5maXJzdCwgKnJocy5maXJzdCk7CiAgIH07CiAgIGF1dG8gY29uc3QgcmFuZ2VfZW1wdHkgPSBbXSAoaW5wdXRfcmFuZ2UgcmFuZ2UpIHsKICAgCSAgcmV0dXJuIHJhbmdlLmZpcnN0ID09IHJhbmdlLnNlY29uZDsKICAgfTsKCQogICBpbnB1dC5lcmFzZShzdGQ6OnJlbW92ZV9pZihzdGQ6OmJlZ2luKGlucHV0KSwgc3RkOjplbmQoaW5wdXQpLCByYW5nZV9lbXB0eSksIHN0ZDo6ZW5kKGlucHV0KSk7CQogICAgICAgCiAgIHdoaWxlICghaW5wdXQuZW1wdHkoKSkgewogICAgICBhdXRvIGNvbnN0IG1pbiA9IHN0ZDo6bWluX2VsZW1lbnQoc3RkOjpiZWdpbihpbnB1dCksIHN0ZDo6ZW5kKGlucHV0KSwgcmFuZ2VfbGVzcyk7CiAgICAgICAgICAgIAogICAgICAqb3V0cHV0KysgPSAqbWluLT5maXJzdCsrOwogICAgICAKICAgICAgaWYgKHJhbmdlX2VtcHR5KCptaW4pKSB7CiAgICAgICAgIGlucHV0LmVyYXNlKG1pbik7CiAgICAgIH0KICAgfQogICAKICAgcmV0dXJuIG91dHB1dDsKfQoKCmludCBtYWluKCkgewogICBzdGQ6OnNpemVfdCBjb25zdCBoZWlnaHQgPSAxMDsKICAgc3RkOjpzaXplX3QgY29uc3Qgd2lkdGggID0gMTA7CiAgIGludCBtYXRyaXhbaGVpZ2h0XVt3aWR0aF07CiAgIGludCBhcnJheVtoZWlnaHQgKiB3aWR0aF07CiAgIAogICBzdGQ6OnNyYW5kKHN0ZDo6dGltZShudWxscHRyKSk7CiAgIGZvciAoYXV0byAmIHJvdyA6IG1hdHJpeCkgewogICAgICBzdGQ6OmdlbmVyYXRlKHN0ZDo6YmVnaW4ocm93KSwgc3RkOjplbmQocm93KSwgW10gKCkgeyByZXR1cm4gc3RkOjpyYW5kKCkgJSAxMDAwOyB9KTsKICAgICAgc3RkOjpzb3J0KHN0ZDo6YmVnaW4ocm93KSwgc3RkOjplbmQocm93KSk7CiAgIH0KICAgCiAgIHN0ZDo6Y291dCA8PCAiYmVmb3JlIG1lcmdlIiA8PCBzdGQ6OmVuZGw7CiAgIGZvciAoYXV0byBjb25zdCYgcm93IDogbWF0cml4KSB7CiAgICAgIHN0ZDo6Y29weShzdGQ6OmJlZ2luKHJvdyksIHN0ZDo6ZW5kKHJvdyksIHN0ZDo6b3N0cmVhbV9pdGVyYXRvcjxpbnQ+e3N0ZDo6Y291dCwgIlx0In0pOwogICAgICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwogICB9CiAgIAogICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50ICosIGludCAqPj4gcm93cyhoZWlnaHQpOwogICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpICE9IGhlaWdodDsgKytpKSB7CiAgICAgIHJvd3NbaV0gPSB7c3RkOjpiZWdpbihtYXRyaXhbaV0pLCBzdGQ6OmVuZChtYXRyaXhbaV0pfTsKICAgfQogICBtZXJnZShyb3dzLCBhcnJheSk7CiAgIAogICBzdGQ6OmNvdXQgPDwgImFmdGVyIG1lcmdlIiA8PCBzdGQ6OmVuZGw7CiAgIHN0ZDo6Y29weShzdGQ6OmJlZ2luKGFycmF5KSwgc3RkOjplbmQoYXJyYXkpLCBzdGQ6Om9zdHJlYW1faXRlcmF0b3I8aW50PntzdGQ6OmNvdXQsICJcdCJ9KTsKICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKfQ==