// of size n each.
#include <bits/stdc++.h>
using namespace std;
// A pair of pairs, first element is going to
// store value, second element index of array
// and third element index in the array.
typedef pair<int, pair<int, int> > ppi;
// This function takes an array of arrays as an
// argument and all arrays are assumed to be
// sorted. It merges them together and prints
// the final sorted output.
vector<int> mergeKArrays(vector<vector<int> > arr)
{
vector<int> output;
// Create a min heap with k heap nodes. Every
// heap node has first element of an array
priority_queue<ppi, vector<ppi>, greater<ppi> > pq;
for (int i = 0; i < arr.size(); i++)
pq.push({ arr[i][0], { i, 0 } });
// Now one by one get the minimum element
// from min heap and replace it with next
// element of its array
while (pq.empty() == false) {
ppi curr = pq.top();
pq.pop();
// i ==> Array Number
// j ==> Index in the array number
int i = curr.second.first;
int j = curr.second.second;
output.push_back(curr.first);
// The next element belongs to same array as
// current.
if (j + 1 < arr[i].size())
pq.push({ arr[i][j + 1], { i, j + 1 } });
}
return output;
}
// Driver program to test above functions
int main()
{
// Change n at the top to change number
// of elements in an array
vector<vector<int> > arr{ { 2, 6, 12 },
{ 1, 9 },
{ 23, 34, 90, 2000 } };
vector<int> output = mergeKArrays(arr);
cout << "Merged array is " << endl;
for (auto x : output)
cout << x << " ";
return 0;
}
Ly8gb2Ygc2l6ZSBuIGVhY2guIAojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4gCgp1c2luZyBuYW1lc3BhY2Ugc3RkOyAKCiAgCi8vIEEgcGFpciBvZiBwYWlycywgZmlyc3QgZWxlbWVudCBpcyBnb2luZyB0byAKLy8gc3RvcmUgdmFsdWUsIHNlY29uZCBlbGVtZW50IGluZGV4IG9mIGFycmF5IAovLyBhbmQgdGhpcmQgZWxlbWVudCBpbmRleCBpbiB0aGUgYXJyYXkuIAoKdHlwZWRlZiBwYWlyPGludCwgcGFpcjxpbnQsIGludD4gPiBwcGk7IAoKICAKLy8gVGhpcyBmdW5jdGlvbiB0YWtlcyBhbiBhcnJheSBvZiBhcnJheXMgYXMgYW4gCi8vIGFyZ3VtZW50IGFuZCBhbGwgYXJyYXlzIGFyZSBhc3N1bWVkIHRvIGJlIAovLyBzb3J0ZWQuIEl0IG1lcmdlcyB0aGVtIHRvZ2V0aGVyIGFuZCBwcmludHMgCi8vIHRoZSBmaW5hbCBzb3J0ZWQgb3V0cHV0LiAKCnZlY3RvcjxpbnQ+IG1lcmdlS0FycmF5cyh2ZWN0b3I8dmVjdG9yPGludD4gPiBhcnIpIAp7IAoKICAgIHZlY3RvcjxpbnQ+IG91dHB1dDsgCgogIAoKICAgIC8vIENyZWF0ZSBhIG1pbiBoZWFwIHdpdGggayBoZWFwIG5vZGVzLiBFdmVyeSAKCiAgICAvLyBoZWFwIG5vZGUgaGFzIGZpcnN0IGVsZW1lbnQgb2YgYW4gYXJyYXkgCgogICAgcHJpb3JpdHlfcXVldWU8cHBpLCB2ZWN0b3I8cHBpPiwgZ3JlYXRlcjxwcGk+ID4gcHE7IAoKICAKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyci5zaXplKCk7IGkrKykgCgogICAgICAgIHBxLnB1c2goeyBhcnJbaV1bMF0sIHsgaSwgMCB9IH0pOyAKCiAgCgogICAgLy8gTm93IG9uZSBieSBvbmUgZ2V0IHRoZSBtaW5pbXVtIGVsZW1lbnQgCgogICAgLy8gZnJvbSBtaW4gaGVhcCBhbmQgcmVwbGFjZSBpdCB3aXRoIG5leHQgCgogICAgLy8gZWxlbWVudCBvZiBpdHMgYXJyYXkgCgogICAgd2hpbGUgKHBxLmVtcHR5KCkgPT0gZmFsc2UpIHsgCgogICAgICAgIHBwaSBjdXJyID0gcHEudG9wKCk7IAoKICAgICAgICBwcS5wb3AoKTsgCgogIAoKICAgICAgICAvLyBpID09PiBBcnJheSBOdW1iZXIgCgogICAgICAgIC8vIGogPT0+IEluZGV4IGluIHRoZSBhcnJheSBudW1iZXIgICAgICAgICAKCiAgICAgICAgaW50IGkgPSBjdXJyLnNlY29uZC5maXJzdDsgICAKCiAgICAgICAgaW50IGogPSBjdXJyLnNlY29uZC5zZWNvbmQ7ICAKCiAgCgogICAgICAgIG91dHB1dC5wdXNoX2JhY2soY3Vyci5maXJzdCk7IAoKICAKCiAgICAgICAgLy8gVGhlIG5leHQgZWxlbWVudCBiZWxvbmdzIHRvIHNhbWUgYXJyYXkgYXMgIAoKICAgICAgICAvLyBjdXJyZW50LiAKCiAgICAgICAgaWYgKGogKyAxIDwgYXJyW2ldLnNpemUoKSkgCgogICAgICAgICAgICBwcS5wdXNoKHsgYXJyW2ldW2ogKyAxXSwgeyBpLCBqICsgMSB9IH0pOyAKCiAgICB9IAoKICAKCiAgICByZXR1cm4gb3V0cHV0OyAKfSAKCiAgCi8vIERyaXZlciBwcm9ncmFtIHRvIHRlc3QgYWJvdmUgZnVuY3Rpb25zIAoKaW50IG1haW4oKSAKeyAKCiAgICAvLyBDaGFuZ2UgbiBhdCB0aGUgdG9wIHRvIGNoYW5nZSBudW1iZXIgCgogICAgLy8gb2YgZWxlbWVudHMgaW4gYW4gYXJyYXkgCgogICAgdmVjdG9yPHZlY3RvcjxpbnQ+ID4gYXJyeyB7IDIsIDYsIDEyIH0sIAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAxLCA5IH0sIAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAyMywgMzQsIDkwLCAyMDAwIH0gfTsgCgogIAoKICAgIHZlY3RvcjxpbnQ+IG91dHB1dCA9IG1lcmdlS0FycmF5cyhhcnIpOyAKCiAgCgogICAgY291dCA8PCAiTWVyZ2VkIGFycmF5IGlzICIgPDwgZW5kbDsgCgogICAgZm9yIChhdXRvIHggOiBvdXRwdXQpIAoKICAgICAgICBjb3V0IDw8IHggPDwgIiAiOyAKCiAgCgogICAgcmV0dXJuIDA7IAp9IA==