#include <iostream>
#include<queue>
#include<string.h>
using namespace std;
int mg[1500][1500];
int pd[1500][1500]={0};
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
int k=1;
int ans[100050]={0};
int sum;
int a[100050];
int b[100050];
struct point
{
int sz;
int x;
int y;
};
int main()
{
char ch;
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) {cin>>ch; mg[i][j]=ch-'0';}
for(int i=1;i<=m;i++) cin>>a[i]>>b[i];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(!pd[i][j])
{
sum=1;
pd[i][j]=k;
queue<point>r;
point ks;
ks.x=i;
ks.y=j;
ks.sz=mg[i][j];
r.push(ks);
while(!r.empty())
{
int x1=r.front().x;
int y1=r.front().y;
for(int j=0;j<4;j++)
{
if(mg[x1+dx[j]][y1+dy[j]]!=r.front().sz&&!pd[x1+dx[j]][y1+dy[j]]&&x1+dx[j]<=n&&x1+dx[j]>=1&&y1+dy[j]<=n&&y1+dy[j]>=1)
{
pd[x1+dx[j]][y1+dy[j]]=k;
point temp;
temp.x=x1+dx[j];
temp.y=y1+dy[j];
temp.sz=mg[x1+dx[j]][y1+dy[j]];
r.push(temp);
sum++;
}
}
r.pop();
}
ans[k]=sum;
k++;
}
}
}
for(int i=1;i<=m;i++)
{
int q=a[i];
int p=b[i];
cout<<ans[pd[q][p]]<<endl;
}
}