#include #include #include using namespace std; struct Edge{ pair v; int weight; }; // input edges struct PQ{ int d; pair v; }; // distance and target bool operator>(const PQ &l, const PQ &r){ return l.d > r.d; } int dijkstra(int R, int C, const vector>& grid, int m) { vector> dist(R, vector(C, 1e9)); priority_queue,greater> pq; for(int i = 0; i < C; ++i) pq.push({dist[R-1][i] = (grid[R-1][i] < m), {R-1, i}}); while (!pq.empty()) { auto d = pq.top().d; auto u = pq.top().v; pq.pop(); if(u.first == 0) return d; if (d == dist[u.first][u.second]) for(auto e : {pair{1, 0}, {0, 1}, {-1, 0}, {0, -1}}){ int r2 = u.first+e.first, c2 = u.second+e.second; if(r2 < 0 or c2 < 0 or r2 >= R or c2 >= C) continue; auto d2 = d + (grid[r2][c2] < m); if(d2 < dist[r2][c2]){ dist[r2][c2] = d2; pq.push({d2, {r2, c2}}); } } } return 1e9; } int main(){ int R, C, k; cin >> R >> C >> k; vector> grid(R, vector(C)); for(auto &x : grid) for(auto &y : x) cin >> y; int l = 0, h = 1e9; while(l < h){ auto m = (l+h+1)/2; if(dijkstra(R, C, grid, m) <= k) l = m; else h = m-1; } cout << l << endl; }