#include <bits/stdc++.h>
using namespace std;
int n,m,b[1001][1001];
int dx[10]={-1,-1,-1,0,0,1,1,1},dy[10]={-1,0,1,-1,1,-1,0,1},ans;
struct node{
int x;
int y;
int h;
}a[1002001];
bool fl[1001][1001];
bool cmp(node x,node y){
return x.h>y.h;
}
void dfs(int x,int y){
fl[x][y]=true;
for(int i=0;i<=7;i++){
int tx=x+dx[i];
int ty=y+dy[i];
if(x>0 && y>0 && x<n+1 && y<m+1 && !fl[tx][ty] && b[tx][ty]<=b[x][y]){
dfs(tx,ty);
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>b[i][j];
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
a[i*n-n+j].x=i;
a[i*n-n+j].y=j;
a[i*n-n+j].h=b[i][j];
}
}
sort(a+1,a+1+n*m,cmp);
for(int i=1;i<=n*m;i++){
int nx=a[i].x;
int ny=a[i].y;
if(!fl[nx][ny] && a[i].h>=b[nx-1][ny-1] && a[i].h>=b[nx-1][ny] && a[i].h>=b[nx-1][ny+1] && a[i].h>=b[nx][ny-1] && a[i].h>=b[nx][ny+1] && a[i].h>=b[nx+1][ny+1] && a[i].h>=b[nx+1][ny] && a[i].h>=b[nx+1][ny-1]){
dfs(nx,ny);
ans++;
}
}
cout<<ans;
return 0;
}