#include using namespace std; vector di = {0, 1, 0, -1}; vector dj = {1, 0, -1, 0}; int main() { cin.tie(nullptr); ios_base::sync_with_stdio(false); int N, M, K; cin >> N >> M >> K; vector A(N, vector(M)); for (int i = 0; i < N; i++) for (int j = 0; j < M; j++) cin >> A[i][j]; int ok = 1, ng = 1e9 + 1; while (ng - ok > 1) { int mid = (ok + ng) / 2; deque> deq; vector dist(N, vector(M, 1 << 30)); deq.push_back({0, 0}); dist[0][0] = (A[0][0] < mid ? 1 : 0); while (!deq.empty()) { int vi = deq.front().first; int vj = deq.front().second; deq.pop_front(); for (int dir = 0; dir < 4; dir++) { int ni = vi + di[dir]; int nj = vj + dj[dir]; if (ni < 0 || N <= ni || nj < 0 || M <= nj) continue; int cost = (A[ni][nj] < mid ? 1 : 0); int d = dist[vi][vj] + cost; if (dist[ni][nj] > d) { dist[ni][nj] = d; if (cost == 0) { deq.push_front({ni, nj}); } else { deq.push_back({ni, nj}); } } } } if (dist[N - 1][M - 1] <= K) ok = mid; else ng = mid; } cout << ok << '\n'; }