#include<iostream>
#include<queue>
#include<vector>
using namespace std;
typedef pair<int, pair<int,int> > node;
vector<int> mergeKSortedArray(vector<vector<int> > arr){
vector<int>result;
priority_queue<node, vector<node>, greater<node> > pq;//min priority queue
//insert 0th element of each arr to pq
for(int i=0;i<arr.size();i++){
pq.push({arr[i][0],{i,0}});//we need to store 3 things - val of ele, index of arr, index of ele
}
//remove the ele one by one from min heap and add it to the result vector
while(!pq.empty()){
node current = pq.top();
pq.pop();
int element = current.first;
int x = current.second.first;//row in which element is present
int y = current.second.second;//col in which element is present
result.push_back(element);
//you need to push in pq the next element of current x,y+1
if(y+1<arr.size()){
pq.push({arr[x][y+1],{x,y+1}});
}
}
return result;
}
int main(){
vector<vector<int> >arr{{2,6,12,15},
{1,3,14,20},
{3,5,8,10}};
vector<int>output = mergeKSortedArray(arr);
for(auto x:output){
cout<<x<<" ";
}
return 0;}
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPHF1ZXVlPgojaW5jbHVkZTx2ZWN0b3I+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0eXBlZGVmIHBhaXI8aW50LCBwYWlyPGludCxpbnQ+ID4gbm9kZTsKdmVjdG9yPGludD4gbWVyZ2VLU29ydGVkQXJyYXkodmVjdG9yPHZlY3RvcjxpbnQ+ID4gYXJyKXsKICAgIHZlY3RvcjxpbnQ+cmVzdWx0OwogICAgcHJpb3JpdHlfcXVldWU8bm9kZSwgdmVjdG9yPG5vZGU+LCBncmVhdGVyPG5vZGU+ID4gcHE7Ly9taW4gcHJpb3JpdHkgcXVldWUKICAgIC8vaW5zZXJ0IDB0aCBlbGVtZW50IG9mIGVhY2ggYXJyIHRvIHBxCiAgICBmb3IoaW50IGk9MDtpPGFyci5zaXplKCk7aSsrKXsKICAgICAgICBwcS5wdXNoKHthcnJbaV1bMF0se2ksMH19KTsvL3dlIG5lZWQgdG8gc3RvcmUgMyB0aGluZ3MgLSB2YWwgb2YgZWxlLCBpbmRleCBvZiBhcnIsIGluZGV4IG9mIGVsZQogICAgfQogICAgLy9yZW1vdmUgdGhlIGVsZSBvbmUgYnkgb25lIGZyb20gbWluIGhlYXAgYW5kIGFkZCBpdCB0byB0aGUgcmVzdWx0IHZlY3RvcgogICAgd2hpbGUoIXBxLmVtcHR5KCkpewogICAgICAgIG5vZGUgY3VycmVudCA9IHBxLnRvcCgpOwogICAgICAgIHBxLnBvcCgpOwogICAgICAgIGludCBlbGVtZW50ID0gY3VycmVudC5maXJzdDsKICAgICAgICBpbnQgeCA9IGN1cnJlbnQuc2Vjb25kLmZpcnN0Oy8vcm93IGluIHdoaWNoIGVsZW1lbnQgaXMgcHJlc2VudAogICAgICAgIGludCB5ID0gY3VycmVudC5zZWNvbmQuc2Vjb25kOy8vY29sIGluIHdoaWNoIGVsZW1lbnQgaXMgcHJlc2VudAoKICAgICAgICByZXN1bHQucHVzaF9iYWNrKGVsZW1lbnQpOwogICAgICAgIC8veW91IG5lZWQgdG8gcHVzaCBpbiBwcSB0aGUgbmV4dCBlbGVtZW50IG9mIGN1cnJlbnQgeCx5KzEKICAgICAgICBpZih5KzE8YXJyLnNpemUoKSl7CiAgICAgICAgICAgIHBxLnB1c2goe2Fyclt4XVt5KzFdLHt4LHkrMX19KTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0Owp9CmludCBtYWluKCl7CiAgICB2ZWN0b3I8dmVjdG9yPGludD4gPmFycnt7Miw2LDEyLDE1fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxLDMsMTQsMjB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgezMsNSw4LDEwfX07CgogICAgdmVjdG9yPGludD5vdXRwdXQgPSBtZXJnZUtTb3J0ZWRBcnJheShhcnIpOwogICAgZm9yKGF1dG8geDpvdXRwdXQpewogICAgICAgIGNvdXQ8PHg8PCIgIjsKICAgIH0KCgoKcmV0dXJuIDA7fQo=