#include<bits/stdc++.h>
#define ll long long
#define ld long double
using namespace std;
ll XN[100000010],DN[100000010];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
//freopen("","r",stdin);
//freopen("","w",stdout);
ll r,c;cin>>r>>c;
ll LN[r+1][c+1];
vector<ll>v(0);v.push_back(0);
for(ll i=1;i<=r;i++){
for(ll j=1;j<=c;j++){
cin>>LN[i][j];
XN[LN[i][j]]=i;
DN[LN[i][j]]=j;
v.push_back(LN[i][j]);
}
}
sort(v.begin(),v.end());
//for(int i=1;i<=r*c;i++)cout<<v[i]<<" ";
ll f[r+1][c+1];
for(ll i=1;i<=r;i++){
for(ll j=1;j<=c;j++){
f[i][j]=1;
}
}
for(ll i=1;i<=r*c;i++){
ll x=XN[v[i]],y=DN[v[i]];
if(x-1>0){
if(LN[x-1][y]>LN[x][y]){
f[x-1][y]=max(f[x-1][y],f[x][y]+1);
}
}
if(x+1<=r){
if(LN[x+1][y]>LN[x][y]){
f[x+1][y]=max(f[x+1][y],f[x][y]+1);
}
}
if(y-1>0){
if(LN[x][y-1]>LN[x][y]){
f[x][y-1]=max(f[x][y-1],f[x][y]+1);
}
}
if(y+1<=c){
if(LN[x][y+1]>LN[x][y]){
f[x][y+1]=max(f[x][y+1],f[x][y]+1);
}
}
/*for(int aa=1;aa<=r;aa++){
for(int bb=1;bb<=c;bb++){
cout<<f[aa][bb]<<" ";
}
cout<<endl;
}
cout<<endl;*/
}
ll maxn=-1;
for(ll i=1;i<=r;i++){
for(ll j=1;j<=c;j++){
maxn=max(maxn,f[i][j]);
}
}
cout<<maxn;
return 0;
}
#1#3#10WA