#include <bits/stdc++.h>
using namespace std;
#define ll long long

bool func(ll mid, vector<vector<ll>> &V, ll r)
{
    map<ll, ll> mt;
    ll cnt = 0;
    vector<pair<ll, map<ll, ll>>> mp(V[0].size(), {0, mt});
    for (ll i = 0; i < mid; i++)
    {
        for (ll j = 0; j < V[0].size(); j++)
        {
            ll d = V[i][j];
            ll ct = 0;
            while (d > 0)
            {
                ll k = d % 2;
                if (k == 1)
                {
                    mp[j].second[ct]++;
                    if (mp[j].second[ct] == 1)
                    {
                        mp[j].first = mp[j].first + (1 << ct);
                    }
                }
                d = d / 2;
                ct++;
            }
        }
    }
    map<ll, ll> pm;
    ll ans = 0;
    for (ll i = 0; i < mid; i++)
    {
        ll s = mp[i].first;
        ll ct = 0;
        while (s > 0)
        {
            ll k = s % 2;
            if (k == 1)
            {
                pm[ct]++;
                if (pm[ct] == 1)
                {
                    ans = ans + (1 << ct);
                }
            }
            s = s / 2;
            ct++;
        }
    }
    if (ans > r)
    {
        cnt++;
    }

    ll j = 0;
    for (ll i = mid; i < V[0].size(); i++)
    {
        ll t = mp[j].first;
        ll ctt = 0;
        while (t > 0)
        {
            ll k = t % 2;
            if (k == 1)
            {
                pm[ctt]--;
                if (pm[ctt] == 0)
                {
                    ans = ans - (1 << ctt);
                }
            }
            ctt++;
            t = t / 2;
        }
        ll s = mp[i].first;
        ll ct = 0;
        while (s > 0)
        {
            ll k = s % 2;
            if (k == 1)
            {
                pm[ct]++;
                if (pm[ct] == 1)
                {
                    ans = ans + (1 << ct);
                }
            }
            s = s / 2;
            ct++;
        }
        j++;
        if (ans > r)
        {
            cnt++;
        }
    }
    ll l = 0;
    for (ll i = mid; i < V.size(); i++)
    {
        for (ll j = 0; j < V[0].size(); j++)
        {
            ll e = V[l][j];
            ll ctt = 0;
            while (e > 0)
            {
                ll k = e % 2;
                if (k == 1)
                {
                    mp[j].second[ctt]--;
                    if (mp[j].second[ctt] == 0)
                    {
                        mp[j].first = mp[j].first - (1 << ctt);
                    }
                }
                e = e / 2;
                ctt++;
            }
            ll d = V[i][j];
            ll ct = 0;
            while (d > 0)
            {
                ll k = d % 2;
                if (k == 1)
                {
                    mp[j].second[ct]++;
                    if (mp[j].second[ct] == 1)
                    {
                        mp[j].first = mp[j].first + (1 << ct);
                    }
                }
                d = d / 2;
                ct++;
            }
        }
       
        map<ll, ll> pmm;
        ans = 0;
        for (ll i1 = 0; i1 < mid; i1++)
        {
            ll s1 = mp[i1].first;
            ll ct1 = 0;
            while (s1 > 0)
            {
                ll k1 = s1 % 2;
                if (k1 == 1)
                {
                    pmm[ct1]++;
                    if (pmm[ct1] == 1)
                    {
                        ans = ans + (1 << ct1);
                    }
                }
                s1 = s1 / 2;
                ct1++;
            }
        }
        if (ans > r)
        {
            cnt++;
        }
        ll j1 = 0;
        for (ll i1 = mid; i1 < V[0].size(); i1++)
        {
            ll t1 = mp[j1].first;
            ll ctt1 = 0;
            while (t1 > 0)
            {
                ll k1 = t1 % 2;
                if (k1 == 1)
                {
                    pmm[ctt1]--;
                    if (pmm[ctt1] == 0)
                    {
                        ans = ans - (1 << ctt1);
                    }
                }
                ctt1++;
                t1 = t1 / 2;
            }
            ll s1 = mp[i1].first;
            ll ct1 = 0;
            while (s1 > 0)
            {
                ll k1 = s1 % 2;
                if (k1 == 1)
                {
                    pmm[ct1]++;
                    if (pmm[ct1] == 1)
                    {
                        ans = ans + (1 << ct1);
                    }
                }
                s1 = s1 / 2;
                ct1++;
            }
            j1++;
            if (ans > r)
            {
                cnt++;
            }
        }
            l++;
    }
    return cnt > 0;
}

int main()
{
    ll n, m, r;
    cin >> n >> m >> r;
    vector<vector<ll>> V(n, vector<ll>(m));
    for (ll i = 0; i < n; i++)
    {
        for (ll j = 0; j < m; j++)
        {
            cin >> V[i][j];
        }
    }
    ll low = 1, high = min(n, m);
    while (high - low > 1)
    {
        ll mid = (low + high) / 2;
        if (func(mid, V, r))
        {
            high = mid;
        }
        else
        {
            low = mid + 1;
        }
       
    }
    if (func(low, V, r))
    {
        cout << low << endl;
    }
    else if (func(high, V, r))
    {
        cout << high << endl;
    }
    else
    {
        cout << -1 << endl;
    }
    return 0;
}