#include<bits/stdc++.h>
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
using namespace std;
#define int long long
int n,m,t;
int a[2005][2005];
bool v[2005][2005];
struct node{
int x,y;
int z;
friend bool operator>(node a,node b){
return a.z>b.z;
}
};
priority_queue<node,vector<node>,greater<node> >q;
int walk[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int ans;
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m>>t;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
ans=n*m;
for(int i=1;i<=n;i++){
q.push({i,1,a[i][1]});
q.push({i,m,a[i][m]});
v[i][1]=1;
v[i][m]=1;
}
for(int i=1;i<=m;i++){
if(v[1][i])continue;
if(v[n][i])continue;
q.push({1,i,a[1][i]});
q.push({n,i,a[n][i]});
v[1][i]=1;
v[n][i]=1;
}
for(int i=1;i<=t;i++){
while(!q.empty()){
node u=q.top();
if(u.z>i)break;
q.pop();
ans--;
for(int j=0;j<4;j++){
int nx=u.x+walk[j][0],ny=u.y+walk[j][1];
if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&!v[nx][ny]){
q.push({nx,ny,a[nx][ny]});
v[nx][ny]=1;
}
}
}
cout<<ans<<"\n";
}
return 0;
}