#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
const int N = 1e5;
int r,c,n;
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
struct node
{
int x,y,h;
friend bool operator<(node a,node b)
{
return a.h<b.h;
}
}a[N];
int f[150][150],h[120][120];
bool ok(int x,int y)
{
if(x<=0||x>r||y<=0||y>c) return false;
return true;
}
int main()
{
cin>>r>>c;
for(int i=1;i<=r;i++)
{
for(int j=1;j<=c;j++)
{
a[n].x=i;
a[n].y=j;
cin>>h[i][j];
a[n].h=h[i][j];
n++;
}
}
sort(a,a+n);
for(int i=1;i<=120;i++)
{
for(int j=1;j<=120;j++)
{
f[i][j]=1;
}
}
for(int i=1;i<n;i++)
{
for(int j=0;j<4;j++)
{
int x1=a[i].x+dx[j];
int y1=a[i].y+dy[j];
if(ok(x1,y1))
{
if(h[x1][y1]>a[i].h)
{
f[x1][y1]=max(f[x1][y1],1+f[a[i].x][a[i].y]);
}
}
}
}
int pos=-1;
for(int i=1;i<=r;i++)
{
for(int j=1;j<=c;j++)
{
pos=max(pos,f[i][j]);
}
}
cout<<pos<<endl;
return 0;
}