#include<iostream>
#include<stdio.h>
#include<cmath>
#include<cstring>
#include<queue>
#define MAX_N 1000
#define MAX_M 100000
#define INF 99999
using namespace std;
int dx[] = { -1,0,0,1 };
int dy[] = { 0,1,-1,0 };
typedef pair<int, int > P;
int n, m, nx, ny;
int cnt = 0;
char a[MAX_N][MAX_N];
P ps[MAX_M];
int d[MAX_N][MAX_N];
char fan(char x) { //做这样一个函数,方便由1取得0,由0取得1;蹲一个简单方法
if (x == '1')
return '0';
else
return '1';
}
int bfs(int x, int y) { //做这样一个BFS函数
queue<P> que; //创建队列
for (int i = 0; i < n; i++) { //一开始设了一个d[][],用来存目标坐标与起始点的距离
for (int j = 0; j < n; j++) {
d[i][j] = INF; //一开始全部默认为无穷大
}
}
que.push(P(x, y)); //把起始点压入队列
d[x][y] = 0; //距离为0
while (que.size()) { //只要队列里还有东西就继续
P p = que.front(); //把队列里的第一个东西取出来
que.pop();
for (int i = 0; i < 4; i++) { //向四周移动
nx = p.first + dx[i]; //移动后的坐标
ny = p.second + dy[i];
if (0 > nx || nx > n || 0 > ny || ny > n || d[nx][ny] !=INF ) {
continue; //越界或者已经走过的舍去
}
if (fan(a[nx][ny]) == a[x][y]) { //如果满足条件(*)
que.push(P(nx, ny)); //压入队列
d[nx][ny] = d[p.first][p.second] + 1;
//距离在原有的基础上+1
cnt++;
}
}
}
return cnt;
}
int main() {
cin >> n >> m;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
for (int i = 0; i < m; i++) {
cin >> ps[i].first >> ps[i].second;
}
for (int i = 0; i < m; i++) {
cout << bfs(ps[i].first - 1, ps[i].second - 1) << endl;
}
}