#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;
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)
{
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;
}