#include <bits/stdc++.h>
#define ll long long
#define ft first
#define sc second
#define el '\n'
#define boost ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define file(name) freopen(name".inp", "r", stdin); freopen(name".out", "w", stdout)
#define pb push_back
#define all(x) (x).begin(),(x).end()
using namespace std;
const ll N = 1000;
ll n, m, a[N + 1][N + 1];
bool SUKUNA[N + 1][N + 1], GOJO[N + 1][N + 1];
pair<ll, ll> sukuna, gojo;
vector<pair<ll, ll>> d = {{0, 1}, {1, 0}, {-1, 0}, {0, -1}, {-1, -1}, {1, -1}, {-1, 1}, {1, 1}};
pair<pair<ll, ll>, pair<ll, ll>> AMON[N + 5];

void read() {
    cin >> n >> m;

    for(ll i = 1; i <= n; i ++) {
        for(ll j = 1; j <= m; j ++) {
            cin >> a[i][j];
            if(sukuna.ft == 0 && (a[i][j] == 1 || a[i][j] == 3)) {
                sukuna = {i, j};
            } 
            if(gojo.ft == 0 && (a[i][j] == 2 || a[i][j] == 3)) {
                gojo = {i, j};
            }
        }
    }
}

void dfsSUKUNA(ll x, ll y) {
    SUKUNA[x][y] = 1;

    for(auto [i, j] : d) {
        ll new_i = i + x;
        ll new_j = j + y;
        if(new_i < 1 || new_i > n || new_j < 1 || new_j > m 
            || a[new_i][new_j] == 2 || a[new_i][new_j] == 0 
            || SUKUNA[new_i][new_j]) continue;

        dfsSUKUNA(new_i, new_j);
    }
}

void dfsGOJO(ll x, ll y) {
    GOJO[x][y] = 1;

    for(auto &[i, j] : d) {
        ll new_i = i + x;
        ll new_j = j + y;
        if(new_i < 1 || new_i > n || new_j < 1 || new_j > m 
            || a[new_i][new_j] == 1 || a[new_i][new_j] == 0
            || GOJO[new_i][new_j]) continue;

        dfsGOJO(new_i, new_j);
    }
}

void solve() {
    dfsSUKUNA(sukuna.ft, sukuna.sc);

    for(ll i = 1; i <= n; i ++) {
        ll dau = 0, cuoi = 0;
        for(ll j = 1; j <= m; j ++) {
            if(SUKUNA[i][j]) {
                dau = j;
                break;
            }
        }

        for(ll j = m; j >= 1; j --) {
            if(SUKUNA[i][j]) {
                cuoi = j;
                break;
            }
        }

        for(ll j = dau; j <= cuoi; j ++) {
            SUKUNA[i][j] = 1;
        }
    }

    dfsGOJO(gojo.ft, gojo.sc);

    for(ll i = 1; i <= n; i ++) {
        ll dau = 0, cuoi = 0;
        for(ll j = 1; j <= m; j ++) {
            if(GOJO[i][j]) {
                dau = j;
                break;
            }
        }

        for(ll j = m; j >= 1; j --) {
            if(GOJO[i][j]) {
                cuoi = j;
                break;
            }
        }

        for(ll j = dau; j <= cuoi; j ++) {
            GOJO[i][j] = 1;
        }
    }

    ll cnt = 0;

    for(ll i = 1; i <= n; i ++) {
        for(ll j = 1; j <= m; j ++) {
            if(SUKUNA[i][j] && GOJO[i][j]) cnt ++;
        }
    }

    cout << cnt;
}

void write() {

}

int main() {
    boost;
    //file();
    read();
    solve();
    write();
    return 0;
}
