#include using namespace std; using i64 = long long; #define yn(pope) (pope ? "Yes" : "No") #define rep(i, n, m) for (int i = (n); i < (m); i++) #define rrep(i, n, m) for (int i = (n); i > m; i--) #define IINF (1 << 30) #define INF (1ll << 60) #define all(v) v.begin(), v.end() int main() { int H, W; cin >> H >> W; vector A(W, vector(H, 0ll)); rep(i, 0, H) { rep(j, 0, W) { cin >> A[j][i]; } } vector used(W, vector(H, -1)); auto valid = [&](int x, int y) -> bool { return 0 <= x && x < W && 0 <= y && y < H; }; int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1}; int ans = 0; using tt = tuple; vector, greater>> V(2); V[0].push({A[0][0], 0, 0}); V[1].push({A[W - 1][H - 1], W - 1, H - 1}); auto play = [&](int t) -> bool { if (V[t].size() > 0) { auto [u, x, y] = V[t].top(); V[t].pop(); used[x][y] = t; rep(i, 0, 4) { int _x = x + dx[i], _y = y + dy[i]; if (valid(_x, _y)) { if (used[_x][_y] == -1) { V[t].push({A[_x][_y], _x, _y}); } if (used[_x][_y] == (t ^ 1)) { return false; } } } } return true; }; int t = 0; while(play(t)) { t = t ^ 1; } rep(i, 0, H) { rep(j, 0, W) { ans += (used[j][i] != -1); } } cout << ans - 2 << endl; return 0; }