#include<bits/stdc++.h>
using namespace std;
char room[1010][1010];
bool visited[1010][1010];
int flag[1010][1010];
int sum[1000010];
int direct[4][2] = {{-1,0},{0,-1},{1,0},{0,1}};
int n,m;
int num;
int cnt = 1;
struct node
{
int x,y;
};
bool check_border(int x,int y)
{
if(x>=1&&x<=n&&y>=1&&y<=n)
return 1;
else
return 0;
}
bool check_flag(node m1,node m2)
{
if(room[m1.x][m1.y] != room[m2.x][m2.y])
return 1;
else
return 0;
}
void BFS(int x,int y)
{
memset(visited,0,sizeof(visited));
num = 1;
queue<node>q;
node now,next;
now.x = x;
now.y = y;
q.push(now);
visited[x][y] = 1;
flag[x][y] = cnt;
while(!q.empty())
{
now = q.front();
q.pop();
for(int i=0;i<4;i++)
{
next.x = now.x + direct[i][0];
next.y = now.y + direct[i][1];
if(room[next.x][next.y] == room[now.x][now.y]) continue;
if(visited[next.x][next.y]) continue;
if(!check_border(next.x,next.y)) continue;
visited[next.x][next.y] = 1;
flag[next.x][next.y] = cnt;
num++;
q.push(next);
}
}
sum[cnt++] = num;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>room[i][j];
int x,y;
for(int i=1;i<=m;i++){
scanf("%d%d",&x,&y);
if(sum[flag[x][y]]==0)
BFS(x,y);
printf("%d\n",sum[flag[x][y]]);
}
}