#include<bits/stdc++.h>
using namespace std;
int n,m,k;
const int N=1010;
int s[N][N];
struct cmp{
bool operator()(const tuple<int,int,int>&a,const tuple<int,int,int>&b)
{
return get<0>(a)>get<0>(b);
}
};
int d[][2]={{0,1},{1,0},{-1,0},{0,-1}};
map<array<int,2>,int>mp;
priority_queue<tuple<int, int, int>,vector<tuple<int, int, int>>, cmp>q;
int main()
{
cin>>n>>m>>k;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)cin>>s[i][j];
for(int i=1;i<=n;i++){
if(i==1||i==n){
for(int j=1;j<=m;j++)q.push({s[i][j],i,j}),mp[{i,j}]=1;
}
else {q.push({s[i][1],i,1});q.push({s[i][m],i,m});mp[{i,1}]=1,mp[{i,m}]=1;}
}
int now=0,res=0;
auto dfs=[&](int x,int y){
for(int i=0;i<4;i++){
int dx=d[i][0]+x;
int dy=d[i][1]+y;
if(dx<1||dy<1||dx>n||dy>m)continue;
if(mp[{dx,dy}])continue;
mp[{dx,dy}]=1;
q.push({s[dx][dy],dx,dy});
}
};
auto bfs=[&](int no){
while(q.size()){
auto [z,x,y]=q.top();
if(z>no)break;
q.pop();
res++;
dfs(x,y);
}
};
for(int i=1;i<=k;i++){
auto [z,x,y]=q.top();
if(z<=i)
bfs(i);
cout<<n*m-res<<endl;
}
}