#ifdef __GNUC__
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#define unordered_map __fast_unordered_map
template<class Key, class Value, class Hash = std::hash<Key>>
using unordered_map = __gnu_pbds::gp_hash_table<Key, Value, Hash>;
#else
#pragma warning(disable:4996)
#include <iostream>
#include <fstream>
#include <vector>
#include <deque>
#include <set>
#include <map>
#include <unordered_map>
#include <list>
#include <array>
#include <cstdlib>
#include <stack>
#include <string>
#include <queue>
#include <chrono>
#include <functional>
#include <limits>
#include <cmath>
#include <algorithm>
#include <random>
#include <regex>
#include <tuple>
#include <numeric>
#include <cassert>
#include <utility>
#include <bitset>
#include <complex>
#include <iomanip>
#include <ostream>
#include <sstream>
#include <ctime>
unsigned int __builtin_popcount(unsigned int x) {
int ret = 0;
while(x)
{
ret += x & 1;
x >>= 1;
}
return ret;
}
unsigned long long __builtin_popcountll(unsigned long long x) {
int ret = 0;
while(x)
{
ret += x & 1LL;
x >>= 1LL;
}
return ret;
}
long long __gcd(long long a, long long b) {
assert(a >= 0);
assert(b >= 0);
if (b == 0) return a;
long long ret = __gcd(b, a % b);
assert(ret);
return ret;
}
int __gcd(int a, int b) {
assert(a >= 0);
assert(b >= 0);
if (b == 0) return a;
int ret = __gcd(b, a % b);
assert(ret);
return ret;
}
#endif
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
const ll INFLL = 2 * (ll)1e18 + 100;
#define for0(i, n) for(int i = 0; i < n; ++i)
#define for1(i, n) for(int i = 1; i <= n; ++i)
#define pb push_back
#define mp make_pair
#define all(v) v.begin(), v.end()
#define V vector<int>
#define VP vector<pair<int, int> >
#define FASTIO ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define index INDEX
template<class T> ostream &operator<<(ostream& os, const vector<T>& v) {
if (v.empty()) return os;
for (std::size_t i = 0; i < v.size() - 1; ++i) os << v[i] << ' ';
return os << v.back();
}
template<class T> ostream &operator<<(ostream& os, const deque<T>& v) {
if (v.empty()) return os;
for (std::size_t i = 0; i < v.size() - 1; ++i) os << v[i] << ' ';
return os << v.back();
}
template<class T> ostream &operator<<(ostream& os, const set<T>& v) {
if (v.empty()) return os;
auto aux = v.end(); --aux;
for(auto it = v.begin(); it != aux; ++it)
{
os << *it << ' ';
}
return os << *aux;
}
template<class T> ostream &operator<<(ostream& os, const multiset<T>& v) {
if (v.empty()) return os;
auto aux = v.end(); --aux;
for(auto it = v.begin(); it != aux; ++it)
{
os << *it << ' ';
}
return os << *aux;
}
template<class L, class R> ostream &operator<<(ostream &os, const pair<L,R>& P) {
return os << P.first << " " << P.second;
}
template<class TH> void _dbg(const char *sdbg, TH h){ cerr << sdbg << " = " << h << '\n'; }
template<class TH, class... TA> void _dbg(const char *sdbg, TH h, TA... a) {
while(*sdbg!=',') cerr << *sdbg++;
cerr<<" = "<< h << ','; _dbg(sdbg + 1, a...);
}
#ifdef AJECC
#define debug(...) _dbg(#__VA_ARGS__, __VA_ARGS__)
#else
#define debug(...) (__VA_ARGS__)
#define cerr if(0)cout
#endif
ll generate_random() {
const ll MAX_RANDOM = (ll)1e12 + 1;
mt19937_64 rng_obfuscated$19937(chrono::steady_clock::now().time_since_epoch().count());
return uniform_int_distribution<unsigned long long>(1LL, MAX_RANDOM)(rng_obfuscated$19937);
}
//#define int ll /// might modify this sometimes
//#define int unsigned short
#ifdef int
const int INFINT = INFLL;
#else
const int INFINT = 2 * (int)1e9 + 100;
#endif
const double PI = atan(1) * 4;
const double EPS = 1e-6; const int SEED = (int)1e3 + 7;
const int MOD = (int)666013;
const int NMAX = (int)150 + 5;
const int NMAX_SQ = NMAX * NMAX;
bool have[NMAX_SQ];
int n, m;
int need[NMAX][NMAX];
int room_no(int x, int y)
{
return m * (x - 1) + y;
}
int dx[] = { 0, 0, 1, -1 };
int dy[] = { 1, -1, 0, 0 };
int start;
bool trecut[NMAX][NMAX];
vector<pair<int, int>> st, newstack;
int sol;
bool improve;
void dfs(int x, int y)
{
if (trecut[x][y]) return;
improve = true;
sol++;
trecut[x][y] = 1;
have[room_no(x, y)] = 1;
for0(i, 4)
{
int newx = x + dx[i], newy = y + dy[i];
if (newx > n || newx <= 0 || newy > m || newy <= 0) continue;
if(have[need[newx][newy]] && !trecut[newx][newy])
dfs(newx, newy);
else if (!have[need[newx][newy]] && !trecut[newx][newy])
{
newstack.emplace_back(newx, newy);
}
}
}
int32_t main() {
FASTIO; /// disable for interactive
#ifdef AJECC
double START_PROGRAM = clock();
#endif
#ifndef AJECC
#define PROB_NAME "castel"
freopen(PROB_NAME".in", "r", stdin);
freopen(PROB_NAME".out", "w", stdout);
#endif
cin >> n >> m >> start;
for1(i, n) for1(j, m) cin >> need[i][j];
dfs(start / m + ((start % m == 0) ? 0 : 1), (start % m == 0) ? m : (start % m));
while (improve)
{
st = newstack;
newstack.clear();
improve = false;
while (!st.empty())
{
auto last = st.back();
st.pop_back();
if (have[need[last.first][last.second]])
dfs(last.first, last.second);
else if (!trecut[last.first][last.second])
newstack.emplace_back(last);
}
}
cout << sol;
#ifdef AJECC
double END_PROGRAM = clock();
double ELAPSED_TIME = (END_PROGRAM - START_PROGRAM) / CLOCKS_PER_SEC;
cerr << "\n\nElapsed Time: " << ELAPSED_TIME * 1000 << "\n";
#endif
return 0;
}