#include <bits/stdc++.h>
using namespace std;
struct node{
int x,y,h;
};
int n,m,dp[105][105],b[105][105];
node a[10005];
bool cmp(node x,node y){
return x.h>y.h;
}
void print(){
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++) cout<<dp[i][j]<<" ";
cout<<endl;
}
cout<<endl;
}
int main() {
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
int p;
cin>>p;
a[(i-1)*n+j]={i,j,p};
b[i][j]=p;
}
}
sort(a+1,a+1+n*m,cmp);
for(int i=1;i<=n*m;i++){
node k=a[i];
if(k.h<b[k.x-1][k.y]) dp[k.x][k.y]=max(dp[k.x-1][k.y],dp[k.x][k.y]);
if(k.h<b[k.x][k.y-1]) dp[k.x][k.y]=max(dp[k.x][k.y-1],dp[k.x][k.y]);
if(k.h<b[k.x+1][k.y]) dp[k.x][k.y]=max(dp[k.x+1][k.y],dp[k.x][k.y]);
if(k.h<b[k.x][k.y+1]) dp[k.x][k.y]=max(dp[k.x][k.y+1],dp[k.x][k.y]);
dp[k.x][k.y]++;
}
int mx=-1;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
mx=max(mx,dp[i][j]);
}
}
cout<<mx;
return 0;
}