#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++;
		  }
		  sum=max(sum,0);
		  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+=1000;
		  	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;
}