#include <cstdio> #include <queue> #include <cstring> #include <algorithm> using namespace std; typedef long long LL; const int maxn = 1000; struct Item{ int s,b; Item(int s=0,int b=0):s(s),b(b){} bool operator <(const Item& rhs) const { return s>rhs.s; } }; int A[1000][1000],n; void Merge(int* A,int* B,int* C){ priority_queue<Item> pq; for(int i=0;i<n;i++) {pq.push(Item(A[i]+B[0],0));} for(int i=0;i<n;i++){ Item te=pq.top(); pq.pop(); C[i]=te.s; if(te.b+1<n) pq.push(Item(te.s-B[te.b]+B[te.b+1],te.b+1)); } } int main() { while(scanf("%d",&n)==1){ for(int i=0;i<n;i++){ for(int j=0;j<n;j++) scanf("%d",&A[i][j]); sort(A[i],A[i]+n); } for(int i=1;i<n;i++){ Merge(A[0],A[i],A[0]); } for(int i=0;i<n;i++){ if(i) printf(" "); printf("%d",A[0][i]); } printf("\n"); } return 0; }