#include<bits/stdc++.h>
using namespace std;
int n,m,a[250005];
int x[]={1,0,0,-1};
int y[]={0,1,-1,0};
vector<int> p[250005];
bool v[250005],k[250005];
int low[250005];
int DFN[250005];
int res[250005];
int in[250005],out[250005];
stack<int> s;
int cnt,cnt2,ans1,ans2;
bool check(int ak){
if(k[ak]) return 0;
if(int(ceil(ak/m))<1||int(ceil(ak/m))>n||(int(ak/m)==n&&ak%m)) return 0;
return 1;
}
void bfs(int now){
v[now]=1;
k[now]=1;
for(int i=0;i<4;i++){
if(a[now]<=a[now+x[i]*m+y[i]]&&!v[now+x[i]*m+y[i]]) p[now+x[i]*m+y[i]].push_back(now);
if(check(now+x[i]*m+y[i])){
if(a[now]>=a[now+x[i]*m+y[i]]){
bfs(now+x[i]*m+y[i]);
p[now].push_back(now+x[i]*m+y[i]);
}
}
}
v[now]=0;
}
void tarjan(int now){
cnt++;
low[now]=cnt;
DFN[now]=cnt;
s.push(now);
v[now]=1;
for(int i=0;i<p[now].size();i++){
if(!DFN[p[now][i]]){
tarjan(p[now][i]);
low[now]=min(low[now],low[p[now][i]]);
}
else if(v[p[now][i]]){
low[now]=min(low[now],DFN[p[now][i]]);
}
}
if(DFN[now]==low[now]){
cnt2++;
int k=s.top();
do{
k=s.top();
s.pop();
v[k]=0;
res[k]=cnt2;
}while(k!=now);
}
}
int main(){
cin>>n>>m;
swap(n,m);
for(int i=1;i<=n*m;i++) cin>>a[i];
for(int i=1;i<=n*m;i++){
if(!k[i]) bfs(i);
}
memset(v,0,sizeof(v));
for(int i=1;i<=n*m;i++){
if(!DFN[i]) tarjan(i);
}
/*for(int i=1;i<=n*m;i++){
for(int j:p[i]) cout<<j<<" ";
cout<<'\n';
}*/
for(int i=1;i<=n*m;i++){
for(auto j:p[i]){
if(res[i]==res[j]) continue;
in[res[j]]++;
out[res[i]]++;
}
}
for(int i=1;i<=cnt2;i++){
if(!in[i]) ans1++;
if(!out[i]) ans2++;
}
if(cnt2==1) cout<<0;
else cout<<max(ans1,ans2);
return 0;
}