#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct node{
int x,y;
ll setp;
};
queue<node> Q,border[10];
const int maxn=1005;
char a[maxn][maxn];
int vis[maxn][maxn];
int n,m,p;
ll ans[10],s[10];
int f[4][2]={
{1,0},{0,1},{0,-1},{-1,0}
};
void bfs(int w)
{
node temp;
int x,y;
while(!Q.empty())
{
temp=Q.front();
Q.pop();
if(temp.setp==0)
border[w].push(temp);
else{
for(int i=0;i<4;i++)
{
x=temp.x+f[i][0];
y=temp.y+f[i][1];
if(x<1||x>n||y<1||y>m||vis[x][y]!=0||a[x][y]!='.') continue;
vis[x][y]=w;
Q.push(node{x,y,temp.setp-1});
}
}
}
}
bool expand(int w)
{
node temp;
while(!border[w].empty())
{
temp=border[w].front();
border[w].pop();
temp.setp=s[w];
Q.push(temp);
}
bfs(w);
return !border[w].empty();
}
int main()
{
cin>>n>>m>>p;
for(int i=1;i<=p;i++)
cin>>s[i];
for(int i=1;i<=n;i++)
cin>>a[i]+1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(a[i][j]>='1'&&a[i][j]<='9')
{
int num=a[i][j]-'0';
border[num].push(node{i,j,s[num]});
vis[i][j]=num;
}
}
}
while(1)
{
bool flag= false;
for(int i=1;i<=p;i++)
flag|=expand(i);
if(!flag)
break;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
ans[vis[i][j]]++;
for(int i=1;i<=p;i++)
cout<<ans[i]<<" ";
}