
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 <= 1:
            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:
            elevators += 1
        else:
            # Is equal to max.
            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

            # Is highest, add elevator (if higher than 1)
            if allMarked:
                elevators += 1

        # else:
        #     # Value is equal, wait for next
        #     # grid[y][x] = 3
        #     pass


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:
            
