#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(){
int n,k,ele;
cin>>n>>k;
/*vector<vector<int> >arr{{2,6,12,15},
{1,3,14,20},
{3,5,8,10}};*/
vector<vector<int> > arr;
for (int i = 0; i < n; i++) {
vector<int> v1;
for (int j = 0; j < k; j++) {
cin>>ele;
v1.push_back(ele);
}
arr.push_back(v1);
}
vector<int>output = mergeKSortedArray(arr);
for(int i=0;i<output.size(); i++){
cout<<output[i]<<" ";
}
return 0;}
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPHF1ZXVlPgojaW5jbHVkZTx2ZWN0b3I+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0eXBlZGVmIHBhaXI8aW50LCBwYWlyPGludCxpbnQ+ID4gbm9kZTsKdmVjdG9yPGludD4gbWVyZ2VLU29ydGVkQXJyYXkodmVjdG9yPHZlY3RvcjxpbnQ+ID4gYXJyKXsKICAgIHZlY3RvcjxpbnQ+cmVzdWx0OwogICAgcHJpb3JpdHlfcXVldWU8bm9kZSwgdmVjdG9yPG5vZGU+LCBncmVhdGVyPG5vZGU+ID4gcHE7Ly9taW4gcHJpb3JpdHkgcXVldWUKICAgIC8vaW5zZXJ0IDB0aCBlbGVtZW50IG9mIGVhY2ggYXJyIHRvIHBxCiAgICBmb3IoaW50IGk9MDtpPGFyci5zaXplKCk7aSsrKXsKICAgICAgICBwcS5wdXNoKHthcnJbaV1bMF0se2ksMH19KTsvL3dlIG5lZWQgdG8gc3RvcmUgMyB0aGluZ3MgLSB2YWwgb2YgZWxlLCBpbmRleCBvZiBhcnIsIGluZGV4IG9mIGVsZQogICAgfQogICAgLy9yZW1vdmUgdGhlIGVsZSBvbmUgYnkgb25lIGZyb20gbWluIGhlYXAgYW5kIGFkZCBpdCB0byB0aGUgcmVzdWx0IHZlY3RvcgogICAgd2hpbGUoIXBxLmVtcHR5KCkpewogICAgICAgIG5vZGUgY3VycmVudCA9IHBxLnRvcCgpOwogICAgICAgIHBxLnBvcCgpOwogICAgICAgIGludCBlbGVtZW50ID0gY3VycmVudC5maXJzdDsKICAgICAgICBpbnQgeCA9IGN1cnJlbnQuc2Vjb25kLmZpcnN0Oy8vcm93IGluIHdoaWNoIGVsZW1lbnQgaXMgcHJlc2VudAogICAgICAgIGludCB5ID0gY3VycmVudC5zZWNvbmQuc2Vjb25kOy8vY29sIGluIHdoaWNoIGVsZW1lbnQgaXMgcHJlc2VudAoKICAgICAgICByZXN1bHQucHVzaF9iYWNrKGVsZW1lbnQpOwogICAgICAgIC8veW91IG5lZWQgdG8gcHVzaCBpbiBwcSB0aGUgbmV4dCBlbGVtZW50IG9mIGN1cnJlbnQgeCx5KzEKICAgICAgICBpZih5KzE8YXJyLnNpemUoKSl7CiAgICAgICAgICAgIHBxLnB1c2goe2Fyclt4XVt5KzFdLHt4LHkrMX19KTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0Owp9CmludCBtYWluKCl7CiAgICBpbnQgbixrLGVsZTsKICAgIGNpbj4+bj4+azsKICAgIC8qdmVjdG9yPHZlY3RvcjxpbnQ+ID5hcnJ7ezIsNiwxMiwxNX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MSwzLDE0LDIwfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHszLDUsOCwxMH19OyovCiAgICB2ZWN0b3I8dmVjdG9yPGludD4gPiBhcnI7CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKCiAgICAgICAgdmVjdG9yPGludD4gdjE7CgogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgazsgaisrKSB7CiAgICAgICAgICAgICBjaW4+PmVsZTsKICAgICAgICAgICAgIHYxLnB1c2hfYmFjayhlbGUpOwogICAgICAgIH0KICAgICAgICBhcnIucHVzaF9iYWNrKHYxKTsKICAgIH0KICAgIHZlY3RvcjxpbnQ+b3V0cHV0ID0gbWVyZ2VLU29ydGVkQXJyYXkoYXJyKTsKICAgIGZvcihpbnQgaT0wO2k8b3V0cHV0LnNpemUoKTsgaSsrKXsKICAgICAgICBjb3V0PDxvdXRwdXRbaV08PCIgIjsKICAgIH0KCgoKcmV0dXJuIDA7fQo=