#include<iostream>
#include<cstring>
#include<queue>
#include<cstdio>
#include<vector>
using namespace std;
#define maxn 1010
#define maxm 10010
int a[maxm];
int ans[maxn];
int read()
{
int x=0;
int f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
{
f=-1;
}
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
int n,m,t;
int main()
{
cin>>n>>m>>t;
memset(a,0,sizeof(a));
for(register int i=1;i<=m;i++)//t 控制有限区间长度
{
for(register int j=1;j<=n;j++)
{
a[j]=read();
}
int q[100010];
int qh=1;
int qe=1;
vector<int>v;
v.clear();
int sum=0;
int maxf=0;//感觉想多了 没有必要控制线性的信息 主需要维护任务队列就行了 怎样优化多个并行任务? v
for(register int j=1;j<=n;j++)
{
while(qh<=qe&&q[qh]<(j-t+1))
{
sum-=a[q[qh]];
qh++;
}
if(a[j]>0)
{
sum+=a[j];
q[++qe]=j;
if(sum>maxf)
{
maxf=sum;
v.clear();
for(register int l=qh;l<=qe;l++)
{
v.push_back(q[l]);
}
}
}
else
{
++qe;
qh=qe;
sum=0;
}
}
for(register int j=0;j<v.size();j++)
{
ans[v[j]]++;
}
}
for(register int i=1;i<=n;i++)
{
printf("%d ",ans[i]);
}
return 0;
}