#include<bits/stdc++.h>
using namespace std;
const int dx[4]={0,0,-1,1};
const int dy[4]={1,-1,0,0};
int n,m;
int p[1001][1001];
struct Point{
int x,y;
};
bool bfs(int fx,int fy,int mx){
bool vis[1001][1001];
memset(vis,false,sizeof(vis));
int ex=n,ey=m;
queue<Point> q;
Point fst;
fst.x=fx,fst.y=fy;
q.push(fst);
vis[fx][fy]=true;
while(!q.empty()){
int nx,ny;
nx=q.front().x;
ny=q.front().y;
vis[nx][ny]=true;
q.pop();
for(int i=0;i<4;i++){
int xx=nx+dx[i];
int yy=ny+dy[i];
if(xx<=0||xx>n||yy<=0||yy>m||vis[xx][yy]==true||p[xx][yy]>mx) continue;
else{
if(xx==n) return true;
Point node;
node.x=xx;
node.y=yy;
q.push(node);
}
}
}
return false;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int l=0x3f3f3f3f,r=0xc0c0c0c0;
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>p[i][j];
if(!p[i][j]) continue;
l=min(l,p[i][j]),r=max(r,p[i][j]);
}
}
int ans=0;
while(l<=r){
int mid=(l+r)>>1;
if(bfs(1,1,mid)) r=mid-1,ans=mid;
else l=mid+1;
}
cout<<ans;
return 0;
}
如果把所有的 int 改为 short int 会TLE,不然会MLE