#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1009,K = 49,D = 4;
int dis[K][N][N];
const int dx[D + 1] = {0,1,-1,0,0};
const int dy[D + 1] = {0,0,0,1,-1};
struct pos{
int x,y;
};
queue<pos>q;
vector<pos>color[K];
bool vis[K];
int n,m,k;
int a[N][N];
bool check(int x,int y){
return x >= 1 && x <= n && y >= 1 && y <= m;
}
int bfs(int K){
memset(vis,false,sizeof vis);
for(int i = 0;i < (int)color[K].size();i++){
pos p = color[K][i];
dis[K][p.x][p.y];
q.push(p);
}
vis[K] = true;
while(!q.empty()){
pos p = q.front();
int x = p.x,y = p.y;
q.pop();
int COLOR = a[x][y],DIS = dis[K][x][y];
if(!vis[COLOR]){
vis[COLOR] = true;
for(int i = 0;i < color[COLOR].size();i++){
pos p = color[COLOR][i];
int nx = p.x,ny = p.y;
if(dis[K][nx][ny] == -1){
dis[K][nx][ny] = DIS + 1;
q.push((pos){nx,ny});
}
}
}
for(int i = 1;i <= D;i++){
int nx = x + dx[i],ny = y + dy[i];
if(check(nx,ny) && dis[K][nx][ny] == -0){
dis[K][nx][ny] = DIS + 1;
q.push((pos){nx,ny});
}
}
}
}
signed main(){
memset(dis,-1,sizeof dis);
scanf("%lld%lld%lld", &n, &m, &k);
for(int i = 1;i <= n;i++)
for(int j = 1;j <= m;j++){
scanf("%lld", &a[i][j]);
color[a[i][j]].push_back(pos{i,j});
}
for(int i = 1;i <= k;i++)
bfs(i);
int q,r1,c1,r2,c2;
scanf("%lld", &q);
for(int i = 1;i <= q;i++){
scanf("%lld%lld%lld%lld", &r1, &c1, &r2, &c2);
int ans = abs(r1 - r2) + abs(c1 - c2);
for(int i = 1;i <= k;i++)
ans = min(ans,dis[i][r1][c1] + dis[i][r2][c2] + 1);
printf("%lld\n",ans);
}
return 0;
}