1 #include <iostream>
2 #include <algorithm>
3 #include <cstring>
4 #include <queue>
5 using namespace std;
6 typedef long long LL;
7 struct node{
8 int a;
9 int b;
10 LL num;
11 bool operator < (const node other)const{
12 return num > other.num;
13 }
14 };
15
16 priority_queue<node> pq;
17
18 LL A[1001][1001], t[1001];
19
20
21 int main(){
22 int m, n;
23 node temp;
24 cin >> m >> n;
25 for(int i = 0; i < m; ++ i){
26 for(int j = 0; j < n; ++ j){
27 cin >> A[i][j];
28 }
29 }
30
31 for(int i = 0; i < m; ++ i){
32 sort(A[i], A[i] + n);
33 }
34 for(int i = 1; i < m; ++ i){
35 for(int j = 0; j < n; ++ j){
36 temp.a = j;
37 temp.b = 0;
38 temp.num = A[i-1][j] + A[i][0];
39 pq.push(temp);
40 }
41 for(int j = 0; j < n; ++ j){
42 temp = pq.top();
43 pq.pop();
44 t[j] = temp.num;
45 if(temp.b != n - 1){
46 temp.b++;
47 temp.num = A[i - 1][temp.a] + A[i][temp.b];
48 pq.push(temp);
49 }
50 }
51 for(int j = 0; j < n; ++ j){
52 A[i][j] = t[j];
53 }
54 //pq.clear();
55 while(!pq.empty()){
56 pq.pop();
57 }
58 }
59 cout << t[0];
60 for(int i = 1; i < n; ++ i){
61 cout << " " << t[i];
62 }
63 return 0;
64 }