#include #include #include using namespace atcoder; using mint = modint998244353; using namespace std; #define rep(i,n) for (int i = 0; i < (n); ++i) #define Inf32 1000000001 #define Inf64 1000000000000000001 int main(){ int n,m,k; cin>>n>>m>>k; k = min(k, n+m); vector a(n,vector(m)); rep(i,n)rep(j,m)cin>>a[i][j]; int ok = 0,ng = 1000000001; while(ng-ok>1){ int mid =(ok+ng)/2; vector d(n,vector(m,Inf32)); deque> D; if(a[0][0]>=mid)d[0][0] = 0; else d[0][0] = 1; D.push_back({0,0}); while(D.size()>0){ int x = D.front().first; int y = D.front().second; D.pop_front(); vector dx = {1,-1,0,0},dy = {0,0,1,-1}; rep(i,4){ int nx = x+dx[i]; int ny = y+dy[i]; if(nx<0||nx>=n||ny<0||ny>=m)continue; int cost = d[x][y]; if(a[nx][ny]=mid)D.push_front({nx,ny}); else D.push_back({nx,ny}); } } } if(d[n-1][m-1] <= k)ok = mid; else ng = mid; } cout<