#include<bits/stdc++.h>
#include<queue>
#define up(i,a,b) for(int i =a;i<=b;i++)
#define down(i,a,b) for(int i=a;i>=b;i--)
#define N 100000
using namespace std;
int n,m;//n代表迷宫大小,m代表有几个入口点
char mapp[1001][1001];//迷宫图
int sx[N],sy[N];
int vis[1001][1001],bs[1001][1001];
int fx[4][2] = {{-1,0},{0,1},{1,0},{0,-1}};
struct yeah{
int x,y,b;//坐标和步数
};
int in(int x,int y)//判断是否越界
{
if(x>=1&&x<=n&&y>=1&&y<=n)
return 1;
return 0;
}
int pdd(int dx,int dy,int x,int y)//判断是不是0和1交替
{
if((mapp[dx][dy]-'0')!=(mapp[x][y]-'0'))
return 1;
return 0;
}
int bfs(int x,int y)//读取进入的坐标
{
queue<yeah> que;
que.push((yeah){x,y,1});//起点入队
int sum=1;//包括起点本身
while(!que.empty())
{
yeah f = que.front();
que.pop();
up(i,0,3)
{
int dx = f.x + fx[i][0];
int dy = f.y + fx[i][1];
if(in(dx,dy)&&pdd(f.x,f.y,dx,dy)&&vis[dx][dy]==0)
{
vis[dx][dy] = -1;
que.push((yeah){dx,dy,f.b+1});
sum++;
}
}
}
return sum;
}
int main()
{
//输入
scanf("%d%d",&n,&m);
string s;
up(i,1,n)
{
cin>>s;
up(j,1,n)
{
mapp[i][j]=s[j-1];
}
}
up(i,1,m)
{
scanf("%d%d",&sx[i],&sy[i]);
}
//开始查找起点
up(i,1,m)
{
if(vis[sx[i]][sy[i]])//已经走过了
{
printf("%d\n",vis[sx[i]][sy[i]]);
}
else
{
vis[sx[i]][sy[i]]=-1;
int sum = bfs(sx[i],sy[i]);
up(j,1,n)
{
up(k,1,n)
{
if(vis[j][k]==-1)
{
vis[j][k] = sum;
}
}
}
printf("%d\n",sum);
}
}
return 0;
}