from collections import deque import sys input = sys.stdin.readline n, m, k = map(int, input().split()) A = [list(map(int, input().split())) for _ in range(n)] INF = 10 ** 10 def f(x): # 0-1 BFS を用いて、(0,0)から(n-1,m-1)までの必要な修正回数の最小値を求める dist = [[INF] * m for _ in range(n)] dq = deque() # スタートセルでは、A[0][0]>=xなら修正不要(コスト0)、そうでなければ修正(コスト1) start_cost = 0 if A[0][0] >= x else 1 dist[0][0] = start_cost dq.append((0, 0)) while dq: i, j = dq.popleft() for di, dj in ((0, 1), (1, 0), (0, -1), (-1, 0)): # 上下左右全ての方向 ni, nj = i + di, j + dj if 0 <= ni < n and 0 <= nj < m: # 次のセルに入るとき、A[ni][nj]がx未満なら修正が必要 add = 0 if A[ni][nj] >= x else 1 if dist[ni][nj] > dist[i][j] + add: dist[ni][nj] = dist[i][j] + add # コストが0なら前に、1なら後ろに追加(0-1 BFSのテクニック) if add == 0: dq.appendleft((ni, nj)) else: dq.append((ni, nj)) return dist[n - 1][m - 1] # 二分探索:答えの候補は 0〜10^9 の間 l, r = 0, 10 ** 9 + 1 while r - l > 1: mid = (l + r) // 2 # midを最低値とする経路が、k回以内の修正で実現できるか判定 if f(mid) > k: r = mid else: l = mid print(l)