import std.stdio, std.string, std.conv, std.algorithm, std.array;

struct P { int x, y; }

void main()
{
    int[102][102] m;
    auto f = readln.split.map!(to!int);
    int W = f[0],
        H = f[1];

    foreach(i; 0 .. H)
    {
        foreach(j, n; readln.split.map!(to!int).array)
        {
            m[i + 1][j + 1] = n;
        }
    }

    W += 2;
    H += 2;

    P[] getRin(P p)
    {
        P[] res;
        if(p.x > 0) res ~= P(p.x - 1, p.y);
        if(p.x < W - 1) res ~= P(p.x + 1, p.y);
        if(p.y % 2 == 0)
        {
            if(p.y > 0)
            {
                res ~= P(p.x, p.y - 1);
                if(p.x > 0) res ~= P(p.x - 1, p.y - 1);
            }
            if(p.y < H - 1)
            {
                res ~= P(p.x, p.y + 1);
                if(p.x > 0) res ~= P(p.x - 1, p.y + 1);
            }
        }
        else
        {
            if(p.y > 0)
            {
                res ~= P(p.x, p.y - 1);
                if(p.x < W - 1) res ~= P(p.x + 1, p.y - 1);
            }
            if(p.y < H - 1)
            {
                res ~= P(p.x, p.y + 1);
                if(p.x < W - 1) res ~= P(p.x + 1, p.y + 1);
            }
        }
        return res;
    }

    void dfs(P p)
    {
        if(m[p.y][p.x] == 0)
        {
            m[p.y][p.x] = 2;
            foreach(rin; getRin(p))
            {
                dfs(rin);
            }
        }
    }

    dfs(P(0, 0));

    int res;
    foreach(y; 1 .. H - 1)
    {
        foreach(x; 1 .. W - 1)
        {
            if(m[y][x] == 1) foreach(rin; getRin(P(x, y)))
            {
                if(m[rin.y][rin.x] == 2) ++res;
            }
        }
    }
    res.writeln;
}