## https://yukicoder.me/problems/no/2855 from collections import deque MAX_VALUE = 10 ** 18 def solve(N, M, K, A, border): B = [[False] * M for _ in range(N)] for i in range(N): for j in range(M): if A[i][j] >= border: B[i][j] = True dist = [[MAX_VALUE for _ in range(M)] for _ in range(N)] passed = [[False for _ in range(M)] for _ in range(N)] dist[0][0] = 0 if A[0][0] >= border else 1 queue = deque() queue.append((0, 0)) while len(queue) > 0: i, j = queue.popleft() if passed[i][j]: continue passed[i][j] = True for di, dj in ((-1, 0), (1, 0), (0, 1), (0, -1)): new_i = di + i new_j = dj + j if 0 <= new_i < N and 0 <= new_j < M: if B[new_i][new_j]: if dist[new_i][new_j] > dist[i][j]: dist[new_i][new_j] = dist[i][j] queue.appendleft((new_i, new_j)) else: if dist[new_i][new_j] > dist[i][j] + 1: dist[new_i][new_j] = dist[i][j] + 1 queue.append((new_i, new_j)) return dist[N - 1][M - 1] <= K def main(): N, M, K = map(int, input().split()) A = [] for _ in range(N): A.append(list(map(int, input().split()))) values = set() for i in range(N): for j in range(M): values.add(A[i][j]) values.add(10 ** 9) values = list(values) values.sort() low = 0 high = len(values) - 1 while high - low > 1: mid = (high + low ) // 2 if solve(N, M, K, A, values[mid]): low = mid else: high = mid if solve(N, M, K, A, values[high]): print(values[high]) else: print(values[low]) if __name__ == '__main__': main()