#include <bits/stdc++.h>
using namespace std;
#define ll long long 
#define e '\n'
#define f(i, a, b) for (ll i = a; i < b; i++)
#define vll vector<ll>
#define all(v) v.begin(),v.end()
#define pb push_back
#define i1(a) \
    ll a;    \
    cin >> a;
#define i2(a, b) \
    ll a, b;    \
    cin >> a >> b;
#define i3(a, b, c) \
    ll a, b, c;    \
    cin >> a >> b >> c;  
#define is(str) \
    string str; \
    cin>>str;
#define vi(arr, n)    \
    vector<ll> arr(n); \
    f(i, 0, n) cin >> arr[i];
#define printv(arr,n) \
    f(i,0,n) cout<<arr[i]<<' ';
#define mod 1000000007
#define ff first
#define ss second
#define mll map<ll,ll>
#define R return
#define light ios_base::sync_with_stdio(false); \
        cin.tie(NULL); 
#define B break
#define C continue
#define YY cout << "YES" << e
#define NN cout << "NO" << e
#pragma GCC optimize ("trapv")

ll Powerfun(ll x, ll y)
{
    ll res = 1;
    while (y)
    {
        if (y & 1) res = (res * x) % mod;
        x = (x * x) % mod; y >>= 1;
    }
    return res;
}

ll add(ll a, ll b){
    return (a%mod+b%mod)%mod;
}

ll sub(ll a, ll b){
    return (a%mod-b%mod+mod)%mod;
}

ll mul(ll a, ll b){
    return ((a%mod)*(b%mod))%mod;
}
 
// O(bits*n^2*log(n))
// bits-> 20

void solve()
{
    i3(n,m,r);
    assert(n>=1 && n<=500 && m>=1 && m<=500); 
    assert(r>=1 && r<=1e6);
    ll mat[n][m];
    ll bits = 20;
    f(i,0,n) f(j,0,m){ 
        cin>>mat[i][j]; 
        assert(mat[i][j]>=1 && mat[i][j]<=1e6);
    }
    vector<vector<vector<ll>>> prefix(n,vector<vector<ll>>(m,vector<ll>(bits,0)));
   
    f(i,0,n){
        f(j,0,m){
            f(k,0,bits){
                if(j-1>=0){
                    prefix[i][j][k]+=prefix[i][j-1][k];
                }
                if(i-1>=0){
                    prefix[i][j][k]+=prefix[i-1][j][k];
                }
                if(i-1>=0 && j-1>=0){
                    prefix[i][j][k]-=prefix[i-1][j-1][k];
                }
                if((1ll<<k)&mat[i][j]){
                    prefix[i][j][k]++; 
                }
            }
        }
    }
    ll ans_sz = 1e9; 
    
    f(i,0,n){
        f(j,0,m){
            ll lo = 1, hi = min(n,m);
            while(lo<=hi){
                ll sz = (lo+hi)/2;
                if(i-sz+1>=0 && j-sz+1>=0){
                    vector<ll> cur(bits,0);
                    ll val = 0; 
                    f(k,0,bits){
                        cur[k]+=prefix[i][j][k]; 
                        if(i-sz>=0){
                            cur[k]-=prefix[i-sz][j][k]; 
                        }
                        if(j-sz>=0){
                            cur[k]-=prefix[i][j-sz][k]; 
                        }
                        if(i-sz>=0 && j-sz>=0){
                            cur[k]+=prefix[i-sz][j-sz][k]; 
                        }
                        if(cur[k]){
                            val|=(1ll<<k); 
                        }
                    }
                    if(val>r){
                        ans_sz = min(ans_sz,sz); 
                        hi = sz-1; 
                    }
                    else lo = sz+1; 
                }
                else{
                    hi = sz-1; 
                }
            }
        }
    }
    cout<<(ans_sz==1e9?-1:ans_sz)<<e; 
}

int32_t main()
{
    light

    int t = 1;
    // cin>>t;
    while (t--)
        solve();
    return 0;
}

