#include <iostream>
#include <queue>
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
#define inf 10000000
int n, m;
int dir[4][2] = {0, -1, 0, 1, 1, 0, -1, 0};
int ans[5000000 + 5];
int mp[1000 + 5][1000 + 5];
typedef struct Node{
int level;
int type;
int sx, sy;
friend bool operator< (Node n1, Node n2){
if(n1.level == n2.level)
return n1.type > n2.type;
return n1.level > n2.level;
}
};
priority_queue<Node> q;
void bfs(){
Node s, e;
while(!q.empty()){
s = q.top();
q.pop();
int tmp = -inf;
for(int i = 0; i < 4; i++){
int dx = s.sx + dir[i][0];
int dy = s.sy + dir[i][1];
if(dx < 0 || dx >= n || dy < 0 || dy >= m)
continue;
if(mp[dx][dy] > 0)
continue;
if(mp[dx][dy] + s.level >= 0){
e.sx = dx;
e.sy = dy;
e.type = s.type;
ans[s.type]++;
e.level = s.level;
mp[dx][dy] = s.type;
q.push(e);
}
else if(mp[dx][dy] > tmp)
tmp = mp[dx][dy];
}
if(tmp != -inf){
s.level = -tmp;
q.push(s);
}
}
}
int main(){
while(scanf("%d %d", &n, &m) != EOF){
memset(ans, 0, sizeof(ans));
memset(mp, 0, sizeof(mp));
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++){
scanf("%d", &mp[i][j]);
if(mp[i][j] > 0){
Node node;
node.sx = i;
node.sy = j;
node.type = mp[i][j];
node.level = 1;
q.push(node);
ans[mp[i][j]]++;
}
}
bfs();
int Q;
scanf("%d", &Q);
int a;
for(int i = 0; i < Q; i++){
scanf("%d", &a);
printf("%d\n", ans[a]);
}
}
return 0;
}