#include<iostream>
#include<stdio.h>
#include<queue>
using namespace std;
typedef pair<int,int>PII;
const int INF=1e8;
const int MAX_N=1005;
char maze[MAX_N][MAX_N];
int d[MAX_N][MAX_N];//d[i][j]说明点(i,j)能走到的最大路径
bool st[MAX_N][MAX_N];
int n,m;
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
//表示点(x,y)所能走的最大路径
int bfs(int x,int y)
{
queue<PII>q;
int sx=x,sy=y;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
d[i][j]=INF;
st[i][j]=false;//flase表示还没有搜索过
}
//表示将起点加入队列
q.push(PII(sx,sy));
st[x][y]=true;//表示起点已经被搜索过了
d[x][y]=1;//起点也要算上,路径起始为1
while(q.size())
{
PII p=q.front();
q.pop();
for(int i=0;i<4;i++)
{
int x0=p.first,y0=p.second;
int nx=x0+dx[i],ny=y0+dy[i];
if(1<=nx&&nx<=n&&1<=ny&&ny<=n&&maze[nx][ny]!=maze[x0][y0]&&d[nx][ny]==INF
&&!st[nx][ny])
{
q.push(PII(nx,ny));
st[nx][ny]=true;//表示点(nx,ny)已经搜索过了
d[x][y]++;//路径大小加一
}
}
}
return d[x][y];
}
int main()
{
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)
{
getchar();
for(int j=1;j<=n;j++)
scanf("%c",&maze[i][j]);
}
for(int i=0;i<m;i++)
{
int x,y;
scanf("%d %d",&x,&y);
printf("%d\n",bfs(x,y));
}
return 0;
}