#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define ld long double
#define bigint __int128
#define emb emplace_back
#define pb push_back
#define pii pair <int, int>
#define fi first
#define se second
#define all(v) v.begin(), v.end()
#define Task ""
#define MASK(k) (1ull << k)
#define bitcnt(k) __builtin_popcount(k)
#define testBit(n, k) ((n >> k) & 1)
#define flipBit(n, k) (n ^ (1ll << k))
#define offBit(n, k) (n & ~MASK(k))
#define onBit(n, k) (n | (1ll << k))
template <class T> bool minimize(T &a, T b) {if (a > b) {a = b; return true;} return false;}
template <class T> bool maximize(T &a, T b) {if (a < b) {a = b; return true;} return false;}
const int N = 5e3 + 5, lim = 60, mod = 1e9 + 7;
const ll INF = 1e18;
int n, q;
char a[N][N];
int h[N], l[N], r[N];
ll get_ans() {
ll ans = 0;
for (int i = 1; i <= n; i++) h[i] = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++)
h[j] = (a[i][j] == '0' ? h[j] + 1 : 0);
stack <int> st;
for (int j = 1; j <= n; j++) {
while (!st.empty() && h[st.top()] >= h[j]) st.pop();
l[j] = (st.empty() ? 0 : st.top()) + 1;
st.emplace(j);
}
while (!st.empty()) st.pop();
for (int j = n; j > 0; j--) {
while (!st.empty() && h[st.top()] > h[j]) st.pop();
r[j] = (st.empty() ? n + 1 : st.top()) - 1;
st.emplace(j);
}
for (int i = 1; i <= n; i++)
ans += 1ll * (i - l[i] + 1) * (r[i] - i + 1) * h[i];
}
return ans;
}
namespace sub3 {
void solve() {
cout << get_ans() << '\n';
while (q--) {
int x, y; cin >> x >> y;
a[x][y] ^= 1;
cout << get_ans() << '\n';
}
}
}
namespace sub5 {
short up[N][N], dw[N][N];
ll curAns;
void update(int r, int c) {
up[c][r] = 0;
for (int i = r; i <= n; i++) {
up[c][i] = (a[i][c] == '1' ? i : up[c][i - 1]);
}
dw[c][n + 1] = n + 1;
for (int i = r; i > 0; i--) {
dw[c][i] = (a[i][c] == '1' ? i : dw[c][i + 1]);
}
}
void preProcess() {
for (int c = 1; c <= n; c++) {
update(1, c);
update(n, c);
}
curAns = get_ans();
}
int u[N], d[N];
ll get(int x, int y) {
u[y] = x - up[y][x]; d[y] = dw[y][x] - x;
int L = y, R = y;
while (L > 1 && a[x][L - 1] == '0') --L;
while (R < n && a[x][R + 1] == '0') ++R;
for (int i = y + 1; i <= R; i++) {
u[i] = min(u[i - 1], x - up[i][x]);
d[i] = min(d[i - 1], dw[i][x] - x);
}
for (int i = y - 1; i >= L; i--) {
u[i] = min(u[i + 1], x - up[i][x]);
d[i] = min(d[i + 1], dw[i][x] - x);
}
// min(u[l], u[r]) * min(d[l], d[r])
ll res = 0; int sumX = 0, sumY = 0;
for (int l = y, r_u = y - 1, r_d = y - 1; l >= L; l--) {
// u[l] <= u[r]:
// d[l] <= d[r], d[l] > d[r]
while (r_u < R && u[l] <= u[r_u + 1]) sumX += d[++r_u];
while (r_d < r_u && d[l] <= d[r_d + 1]) sumY += d[++r_d];
res += 1ll * u[l] * d[l] * (r_d - y + 1);
res += 1ll * u[l] * (sumX - sumY);
}
sumX = sumY = 0;
for (int r = y, l_u = y + 1, l_d = y + 1; r <= R; r++) {
// u[r] < u[l]:
// d[r] <= d[l], d[r] > d[l]
while (l_u > L && u[r] < u[l_u - 1]) sumX += d[--l_u];
while (l_d > l_u && d[r] <= d[l_d - 1]) sumY += d[--l_d];
res += 1ll * u[r] * d[r] * (y - l_d + 1);
res += 1ll * u[r] * (sumX - sumY);
}
return res;
}
void solve() {
preProcess();
cout << curAns << '\n';
while (q--) {
int x, y; cin >> x >> y;
if (a[x][y] == '1') {
a[x][y] = '0'; update(x, y);
curAns += get(x, y);
}
else {
curAns -= get(x, y);
a[x][y] = '1'; update(x, y);
}
cout << curAns << '\n';
}
}
}
int main() {
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
if (fopen(Task".inp", "r")) {
freopen(Task".inp", "r", stdin);
freopen(Task".out", "w", stdout);
}
cin >> n >> q;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
cin >> a[i][j];
sub5::solve();
}