
h, w = map(int, input().split())

grid = [[0 for _ in range(w+2)]]
for i in range(h):
    grid.append([0] + list(map(int, input().split())) + [0])
grid.append([0 for _ in range(w+2)])

gridMark = [[False for x in y] for y in grid]
elevators = 0

for y in range(1, h+1):
    for x in range(1, w+1):
        v = grid[y][x]
        if v == 0:
            continue
        other = [grid[y][x+1], grid[y+1][x], grid[y-1][x], grid[y][x-1]]
        mx = max(other)
        if v < mx:
            #grid[y][x] = 0 # Is not highest, so skip.
            pass
        elif v >= mx:
            if v <= 1:
                continue
            gridMark[y][x] = True

            allMarked = True
            for xoff, yoff in [(-1,0), (0,-1), (1,0), (0,1)]:
                v2 = grid[y+yoff][x+xoff]
                if v2 == v and not gridMark[y+yoff][x+xoff]:
                    allMarked = False

            # check if marked all around
            if gridMark[

                # Is highest, add elevator (if higher than 1)
                if allMarked and v > 1:
                    elevators += 1
        else:
            # Value is equal, wait for next
            grid[y][x] = 3


print(elevators)
# newToCheck = []
# toCheck = [(x, y) for x in range(w) for y in range(h) if grid[y][x] > 1]

# while toCheck:
#     for x, y in toCheck:
#         v = grid[y][x]
#         other = [grid[y][x+1], grid[y+1][x], grid[y-1][x], grid[y][x-1]]
#         mn, mx = min(other), max(other)

#         if v < mx: # Value is smaller than adjacent, so we can skip
#             continue
#         if 

#         if v - 1 > 1:
#             grid[y][x] -= 1
#             newToCheck.append((x, y))

#     toCheck = newToCheck
#     newToCheck = []

# for y in range(0, h):
#     for x in range(0, w):
#         if grid[y-1][x] == 0 and grid[y][x-1] == 0:
            
