#include<bits/stdc++.h>
using namespace std;
int a[105][105],b[105][105],dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
struct pos{
int x,y,t;
};
int main(){
int n,m,maxn=0;
cin>>n>>m;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>a[i][j];
}
}
queue<pos>q;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
bool b=1;
for(int k=0;k<4;k++){
int nx=i+dir[k][0];
int ny=j+dir[k][1];
if(nx>=0 && nx<n && ny>=0 && ny<m && a[nx][ny]>a[i][j]){
b=0;
break;
}
}
if(b){
q.push({i,j,1});
}
}
}
while(q.size()){
pos p=q.front();
q.pop();
maxn=max(maxn,p.t);
if(maxn==n*m){
break;
}
b[p.x][p.y]=p.t;
for(int i=0;i<4;i++){
int nx=p.x+dir[i][0];
int ny=p.y+dir[i][1];
if(nx>=0 && nx<n && ny>=0 && ny<m && a[p.x][p.y]>a[nx][ny] && p.t+1>b[nx][ny]){
q.push({nx,ny,p.t+1});
}
}
}
cout<<maxn;
return 0;
}