# include<bits/stdc++.h>
using namespace std;
int n , m , start_x , start_y , totel_last , totel_1 , totel[10001] , maze_flag[10001][10001];
int dir[4][2] = {{1 , 0} , {0 , 1} , {-1 , 0} , {0 , -1}};
char maze[10001][10001];
struct Node {
int data_x;
int data_y;
};
queue<Node>que;
void BFS (int x_1 , int y_1) {
totel_1++;
Node start_Node;
start_Node.data_x = x_1;
start_Node.data_y = y_1;
totel_last = 1;
maze_flag[x_1][y_1] = totel_1;
que.push(start_Node);
while (!que.empty()) {
for (int w = 0 ; w < 4 ; w++) {
long int x = que.front().data_x + dir[w][0];
long int y = que.front().data_y + dir[w][1];
if (maze[x][y] != maze[que.front().data_x][que.front().data_y] && maze_flag[x][y] == 0 && x >= 1 && x <= n && y >= 1 && y <= n) {
maze_flag[x][y] = totel_1;
Node New_Node;
New_Node.data_x = x;
New_Node.data_y = y;
totel_last++;
que.push(New_Node);
}
}
que.pop();
}
totel[totel_1] = totel_last;
}
int main() {
cin >> n >> m;
for (int x = 1 ; x <= n ; x++) {
for (int y = 1 ; y <= n ; y++) {
cin >> maze[x][y];
}
}
for (int x = 1 ; x <= n ; x++) {
for (int y = 1 ; y <= n ; y++) {
if (maze_flag[x][y] == 0) {
BFS(x , y);
}
}
}
for (int q = 1 ; q <= m ; q++) {
cin >> start_x >> start_y;
cout << totel[maze_flag[start_x][start_y]] << endl;
}
return 0;
}