#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1005;
const int MAXM = 1000005;
const int INF = 1e9;
int n, q;
string as[MAXN];
int dy[MAXN][MAXN];
int cnt[MAXM];
int tree[4 * MAXM];
int lazy[4 * MAXM];
int max_d = 1;
int total_forts = 0;
void push(int v) {
if (lazy[v] != 0) {
lazy[2 * v] += lazy[v];
tree[2 * v] += lazy[v];
lazy[2 * v + 1] += lazy[v];
tree[2 * v + 1] += lazy[v];
lazy[v] = 0;
}
}
void build(int v, int l, int r) {
tree[v] = -INF;
lazy[v] = 0;
if (l == r) return;
int mid = (l + r) / 2;
build(2 * v, l, mid);
build(2 * v + 1, mid + 1, r);
}
void update_range(int v, int l, int r, int ql, int qr, int val) {
if (ql > r || qr < l) return;
if (ql <= l && r <= qr) {
tree[v] += val;
lazy[v] += val;
return;
}
push(v);
int mid = (l + r) / 2;
update_range(2 * v, l, mid, ql, qr, val);
update_range(2 * v + 1, mid + 1, r, ql, qr, val);
tree[v] = max(tree[2 * v], tree[2 * v + 1]);
}
void set_active(int v, int l, int r, int pos, bool active) {
if (l == r) {
if (active) tree[v] = pos - 1 + lazy[v];
else tree[v] = -INF;
return;
}
push(v);
int mid = (l + r) / 2;
if (pos <= mid) set_active(2 * v, l, mid, pos, active);
else set_active(2 * v + 1, mid + 1, r, pos, active);
tree[v] = max(tree[2 * v], tree[2 * v + 1]);
}
void add_fort(int d) {
if (d <= 0) return;
total_forts++;
cnt[d]++;
if (cnt[d] == 1) {
set_active(1, 1, max_d, d, true);
}
update_range(1, 1, max_d, 1, d, 1);
}
void remove_fort(int d) {
if (d <= 0) return;
total_forts--;
cnt[d]--;
update_range(1, 1, max_d, 1, d, -1);
if (cnt[d] == 0) {
set_active(1, 1, max_d, d, false);
}
}
int odp() {
if (total_forts == 0) return 0;
return tree[1];
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cin>>n>>q;
for (int i = 0; i < n; i++) {
cin >> as[i];
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
dy[i][j] = -1;
}
}
queue<pair<int, int>> q_bfs;
dy[0][0] = 0;
q_bfs.push({0, 0});
int dr[] = {-1, 1, 0, 0};
int dc[] = {0, 0, -1, 1};
while (!q_bfs.empty()) {
int r = q_bfs.front().first;
int c = q_bfs.front().second;
q_bfs.pop();
max_d = max(max_d, dy[r][c]);
for (int i = 0; i < 4; i++) {
int nr = r + dr[i];
int nc = c + dc[i];
if (nr >= 0 && nr < n && nc >= 0 && nc < n) {
if (as[nr][nc] != '#' && dy[nr][nc] == -1) {
dy[nr][nc] = dy[r][c] + 1;
q_bfs.push({nr, nc});
}
}
}
}
build(1, 1, max_d);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (as[i][j] == 'F') {
add_fort(dy[i][j]);
}
}
}
cout << odp() << "\n";
for (int i = 0; i < q; i++) {
int r, c;
cin >> r >> c;
r--; c--;
int d = dy[r][c];
if (as[r][c] == 'F') {
as[r][c] = '.';
remove_fort(d);
} else {
as[r][c] = 'F';
add_fort(d);
}
cout << odp() << "\n";
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY29uc3QgaW50IE1BWE4gPSAxMDA1Owpjb25zdCBpbnQgTUFYTSA9IDEwMDAwMDU7CmNvbnN0IGludCBJTkYgPSAxZTk7CmludCBuLCBxOwpzdHJpbmcgYXNbTUFYTl07CmludCBkeVtNQVhOXVtNQVhOXTsKaW50IGNudFtNQVhNXTsKaW50IHRyZWVbNCAqIE1BWE1dOwppbnQgbGF6eVs0ICogTUFYTV07CmludCBtYXhfZCA9IDE7CmludCB0b3RhbF9mb3J0cyA9IDA7Cgp2b2lkIHB1c2goaW50IHYpIHsKICAgIGlmIChsYXp5W3ZdICE9IDApIHsKICAgICAgICBsYXp5WzIgKiB2XSArPSBsYXp5W3ZdOwogICAgICAgIHRyZWVbMiAqIHZdICs9IGxhenlbdl07CiAgICAgICAgbGF6eVsyICogdiArIDFdICs9IGxhenlbdl07CiAgICAgICAgdHJlZVsyICogdiArIDFdICs9IGxhenlbdl07CiAgICAgICAgbGF6eVt2XSA9IDA7CiAgICB9Cn0KCnZvaWQgYnVpbGQoaW50IHYsIGludCBsLCBpbnQgcikgewogICAgdHJlZVt2XSA9IC1JTkY7CiAgICBsYXp5W3ZdID0gMDsKICAgIGlmIChsID09IHIpIHJldHVybjsKICAgIGludCBtaWQgPSAobCArIHIpIC8gMjsKICAgIGJ1aWxkKDIgKiB2LCBsLCBtaWQpOwogICAgYnVpbGQoMiAqIHYgKyAxLCBtaWQgKyAxLCByKTsKfQoKdm9pZCB1cGRhdGVfcmFuZ2UoaW50IHYsIGludCBsLCBpbnQgciwgaW50IHFsLCBpbnQgcXIsIGludCB2YWwpIHsKICAgIGlmIChxbCA+IHIgfHwgcXIgPCBsKSByZXR1cm47CiAgICBpZiAocWwgPD0gbCAmJiByIDw9IHFyKSB7CiAgICAgICAgdHJlZVt2XSArPSB2YWw7CiAgICAgICAgbGF6eVt2XSArPSB2YWw7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgcHVzaCh2KTsKICAgIGludCBtaWQgPSAobCArIHIpIC8gMjsKICAgIHVwZGF0ZV9yYW5nZSgyICogdiwgbCwgbWlkLCBxbCwgcXIsIHZhbCk7CiAgICB1cGRhdGVfcmFuZ2UoMiAqIHYgKyAxLCBtaWQgKyAxLCByLCBxbCwgcXIsIHZhbCk7CiAgICB0cmVlW3ZdID0gbWF4KHRyZWVbMiAqIHZdLCB0cmVlWzIgKiB2ICsgMV0pOwp9Cgp2b2lkIHNldF9hY3RpdmUoaW50IHYsIGludCBsLCBpbnQgciwgaW50IHBvcywgYm9vbCBhY3RpdmUpIHsKICAgIGlmIChsID09IHIpIHsKICAgICAgICBpZiAoYWN0aXZlKSB0cmVlW3ZdID0gcG9zIC0gMSArIGxhenlbdl07CiAgICAgICAgZWxzZSB0cmVlW3ZdID0gLUlORjsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBwdXNoKHYpOwogICAgaW50IG1pZCA9IChsICsgcikgLyAyOwogICAgaWYgKHBvcyA8PSBtaWQpIHNldF9hY3RpdmUoMiAqIHYsIGwsIG1pZCwgcG9zLCBhY3RpdmUpOwogICAgZWxzZSBzZXRfYWN0aXZlKDIgKiB2ICsgMSwgbWlkICsgMSwgciwgcG9zLCBhY3RpdmUpOwogICAgdHJlZVt2XSA9IG1heCh0cmVlWzIgKiB2XSwgdHJlZVsyICogdiArIDFdKTsKfQoKdm9pZCBhZGRfZm9ydChpbnQgZCkgewogICAgaWYgKGQgPD0gMCkgcmV0dXJuOwogICAgdG90YWxfZm9ydHMrKzsKICAgIGNudFtkXSsrOwogICAgaWYgKGNudFtkXSA9PSAxKSB7CiAgICAgICAgc2V0X2FjdGl2ZSgxLCAxLCBtYXhfZCwgZCwgdHJ1ZSk7CiAgICB9CiAgICB1cGRhdGVfcmFuZ2UoMSwgMSwgbWF4X2QsIDEsIGQsIDEpOwp9Cgp2b2lkIHJlbW92ZV9mb3J0KGludCBkKSB7CiAgICBpZiAoZCA8PSAwKSByZXR1cm47CiAgICB0b3RhbF9mb3J0cy0tOwogICAgY250W2RdLS07CiAgICB1cGRhdGVfcmFuZ2UoMSwgMSwgbWF4X2QsIDEsIGQsIC0xKTsKICAgIGlmIChjbnRbZF0gPT0gMCkgewogICAgICAgIHNldF9hY3RpdmUoMSwgMSwgbWF4X2QsIGQsIGZhbHNlKTsKICAgIH0KfQoKaW50IG9kcCgpIHsKICAgIGlmICh0b3RhbF9mb3J0cyA9PSAwKSByZXR1cm4gMDsKICAgIHJldHVybiB0cmVlWzFdOwp9CgppbnQgbWFpbigpIHsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oMCk7CiAgICBjaW4udGllKDApOwogICBjaW4+Pm4+PnE7CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICBjaW4gPj4gYXNbaV07CiAgICB9CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47IGorKykgewogICAgICAgICAgICBkeVtpXVtqXSA9IC0xOwogICAgICAgIH0KICAgIH0KCiAgICBxdWV1ZTxwYWlyPGludCwgaW50Pj4gcV9iZnM7CiAgICBkeVswXVswXSA9IDA7CiAgICBxX2Jmcy5wdXNoKHswLCAwfSk7CgogICAgaW50IGRyW10gPSB7LTEsIDEsIDAsIDB9OwogICAgaW50IGRjW10gPSB7MCwgMCwgLTEsIDF9OwoKICAgIHdoaWxlICghcV9iZnMuZW1wdHkoKSkgewogICAgICAgIGludCByID0gcV9iZnMuZnJvbnQoKS5maXJzdDsKICAgICAgICBpbnQgYyA9IHFfYmZzLmZyb250KCkuc2Vjb25kOwogICAgICAgIHFfYmZzLnBvcCgpOwoKICAgICAgICBtYXhfZCA9IG1heChtYXhfZCwgZHlbcl1bY10pOwoKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewogICAgICAgICAgICBpbnQgbnIgPSByICsgZHJbaV07CiAgICAgICAgICAgIGludCBuYyA9IGMgKyBkY1tpXTsKICAgICAgICAgICAgaWYgKG5yID49IDAgJiYgbnIgPCBuICYmIG5jID49IDAgJiYgbmMgPCBuKSB7CiAgICAgICAgICAgICAgICBpZiAoYXNbbnJdW25jXSAhPSAnIycgJiYgZHlbbnJdW25jXSA9PSAtMSkgewogICAgICAgICAgICAgICAgICAgIGR5W25yXVtuY10gPSBkeVtyXVtjXSArIDE7CiAgICAgICAgICAgICAgICAgICAgcV9iZnMucHVzaCh7bnIsIG5jfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgYnVpbGQoMSwgMSwgbWF4X2QpOwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuOyBqKyspIHsKICAgICAgICAgICAgaWYgKGFzW2ldW2pdID09ICdGJykgewogICAgICAgICAgICAgICAgYWRkX2ZvcnQoZHlbaV1bal0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGNvdXQgPDwgb2RwKCkgPDwgIlxuIjsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IHE7IGkrKykgewogICAgICAgIGludCByLCBjOwogICAgICAgIGNpbiA+PiByID4+IGM7CiAgICAgICAgci0tOyBjLS07CiAgICAgICAgaW50IGQgPSBkeVtyXVtjXTsKCiAgICAgICAgaWYgKGFzW3JdW2NdID09ICdGJykgewogICAgICAgICAgICBhc1tyXVtjXSA9ICcuJzsKICAgICAgICAgICAgcmVtb3ZlX2ZvcnQoZCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYXNbcl1bY10gPSAnRic7CiAgICAgICAgICAgIGFkZF9mb3J0KGQpOwogICAgICAgIH0KCiAgICAgICAgY291dCA8PCBvZHAoKSA8PCAiXG4iOwogICAgfQoKICAgIHJldHVybiAwOwp9