#include <bits/stdc++.h>
using namespace std;
int a[1010][1010];
int vis[1010][1010];
int len = 0;
int m;
int n;
int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};
queue<int> q;
int dfs(int x, int y){
int res = 1;
for(int i=0;i<4;i++){
int xx = x + dx[i];
int yy = y + dy[i];
if(xx >= 0 && xx <= n-1 && yy >= 0 && yy <= n-1 && a[x][y] != a[xx][yy] && vis[xx][yy] == -1){
vis[xx][yy] = len;
res += dfs(xx,yy);
}
}
return res;
}
vector<int > r;
int main() {
cin >> n >> m;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
scanf("%1d", &a[i][j]);
}
}
memset(vis,-1,sizeof(vis));
for(int i=1;i<=m;i++){
int sx,sy;
cin>>sx>>sy;
sx--,sy--;
if(vis[sx][sy] != -1){
printf("%d\n",r[vis[sx][sy]]);
}else{
vis[sx][sy] = len;
int t = dfs(sx,sy);
r.push_back(t);
printf("%d\n",r[vis[sx][sy]]);
len++;
}
}
}
dfs的vis这么标记,起到了一个类型并查集的作用,本质上这题是考并查集