#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize("O3")
#pragma GCC optimize("O1")
#pragma GCC optimize("O1")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#define int long long
#define cint const int
#define ii pair<int, int>
#define fi first
#define se second
#define vi vector<int>
#define vii vector<vi>
#define pb push_back
#define eb emplace_back
#define pq priority_queue
#define mid(l, r) ((l + r) >> 1)
#define left(id) (id << 1)
#define right(id) ((id << 1) | 1)
#define cntbit(mask) __builtin_popcountll(mask)
#define BIT(mask, i) (mask & (1ll << (i)))
#define ONBIT(mask, i) (mask | (1ll << (i)))
const int MAXN = 1e5 + 15;
const int oo = 1e18;
const int MOD = 1e9 + 7;
const int NMAX = 70;
int M, N, K;
int A[NMAX][NMAX], B[NMAX][NMAX];
int calc(const vector<vector<bool>>& mat) {
if (mat.empty()) return 0;
int m = (int)mat.size();
int n = (int)mat[0].size();
vector<int> f(n, 0), st;
vector<int> g(n, 0);
st.reserve(n);
int ret = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (mat[i][j]) f[j]++;
else f[j] = 0;
while (!st.empty() && f[st.back()] >= f[j]) st.pop_back();
g[j] = st.empty() ? -1 : st.back();
st.push_back(j);
}
st.clear();
for (int j = n - 1; j >= 0; j--) {
while (!st.empty() && f[st.back()] >= f[j]) st.pop_back();
int t = st.empty() ? n : st.back();
ret = max(ret, f[j] * (t - g[j] - 1));
st.push_back(j);
}
st.clear();
}
return ret;
}
void PROCESS() {
if (!(cin >> M >> N >> K)) return;
for (int i = 1; i <= M; i++)
for (int j = 1; j <= N; j++)
cin >> A[i][j];
for (int i = 1; i <= M; i++)
for (int j = 1; j <= N; j++)
cin >> B[i][j];
int ans = 0;
for (int i = 1; i < M + M; i++) {
for (int j = 1; j < N + N; j++) {
int Ax1 = max(i - M + 1, 1ll), Ay1 = max(j - N + 1, 1ll);
int Ax2 = min(i, M), Ay2 = min(j, N);
int Bx1 = Ax1 + M - i;
int By1 = Ay1 + N - j;
int ms = Ax2 - Ax1 + 1;
int ns = Ay2 - Ay1 + 1;
if (ms <= 0 || ns <= 0) continue;
vector<vector<bool>> v(ms, vector<bool>(ns, false));
for (int x = 0; x < ms; x++) {
for (int y = 0; y < ns; y++) {
long long va = (long long)A[Ax1 + x][Ay1 + y];
long long vb = (long long)B[Bx1 + x][By1 + y];
v[x][y] = (llabs(va - vb) <= (long long)K);
}
}
ans = max(ans, calc(v));
}
}
cout << ans << '\n';
}
signed main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
PROCESS();
return 0;
}