#include <iostream>
#include <queue>

using namespace std;
const int arr = 1e3 + 10;
int dr[8] = {0, -1, -1, -1, 0, 1, 1, 1};
int dc[8] = {-1, -1, 0, 1, 1, 1, 0, -1};
int n, m;
bool vis[arr][arr];
int h[arr][arr];

void read(){
    cin >> n >> m;
    for(int i = 1; i <= n; ++i){
        for(int j = 1; j <= m; ++j){
            cin >> h[i][j];
        }
    }
}

bool valid(int r, int c){
    return (r > 0 && c > 0 && r <= n && c <= m);
}

int dfs(int r, int c){
    vis[r][c] = 1;
    int res = 0;
    for(int i = 0; i < 8; ++i){
        int nxt_r = r + dr[i];
        int nxt_c = c + dc[i];
        if(valid(nxt_r, nxt_c)){
            if(h[nxt_r][nxt_c] == h[r][c] && !vis[nxt_r][nxt_c]){
                res += dfs(nxt_r, nxt_c);
            }
            else if(h[nxt_r][nxt_c] > h[r][c]) res++;
        }
    }
    return res;
}

int bfs(int r, int c){
    vis[r][c] = 1;
    queue<pair<int, int>> q;
    q.push({r, c});
    int higher = 0;
    while(!q.empty()){
        int r = q.front().first;
        int c = q.front().second;
        q.pop();
        for(int i = 0; i < 8; ++i){
            int nxt_r = r + dr[i];
            int nxt_c = c + dc[i];
            if(valid(nxt_r, nxt_c)){
                if(h[nxt_r][nxt_c] > h[r][c]){
                    higher++;
                }
                else if(h[nxt_r][nxt_c] == h[r][c] && !vis[nxt_r][nxt_c]){
                    q.push({nxt_r, nxt_c});
                    vis[nxt_r][nxt_c] = 1;
                }
            }
        }
    }
    return higher;
}

void solve(){
    int ans = 0;
    for(int i = 1; i <= n; ++i){
        for(int j = 1; j <= m; ++j){
            if(!vis[i][j]){
                int higher = bfs(i, j);
                if(higher == 0) ans++;
            }
        }
    }
    cout << ans;
}

int main()
{
    read();
    solve();
    return 0;
}
