#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
#define lc 2*pos
#define rc 2*pos+1
#define pii pair<int,int>
#define fi first
#define se second
//CEK ENDL DAN INT LL
#define endl '\n'
#define inf 1e18
#define ti tuple<int,int,int>
#define quick ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
const int mod=1e9+7;
int sf(int a){return (a%mod+mod)%mod;}
int kal(int a,int b){return (sf(a)*sf(b))%mod;}
int tam(int a,int b){return (sf(a)+sf(b))%mod;}
int kur(int a,int b){return (sf(a)+mod-sf(b))%mod;}
#pragma GCC optimize("O3,unroll-loops")
//#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
int inv(int a){
if(a<=1) return 1;
return mod-(int)(mod/a)*inv(mod%a)%mod;
}
int bag(int a,int b){return kal(sf(a),inv(b));}
const int lim=3e5+10;
int par[lim+10];
int sz[lim+10];
int perlu[lim];
int jadi[lim];
pii bagus[lim+10];
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
vector<pii>pasang[lim+10];
int p(int x){
if(x==par[x]) return x;
return par[x]=p(par[x]);
}
pii mana(pii a,pii b){
if(a.fi>=b.fi) return a;
return b;
}
int cek(int u,int v){
u=p(u);
v=p(v);
if(u==v) return 1;
return 0;
}
set<int>punyasiap[lim+10];
void gab(int u,int v,int val){
u=p(u);
v=p(v);
if(u==v) return;
if(sz[u]>sz[v]) swap(v,u);
sz[v]+=sz[u];
for(auto x:punyasiap[u]){
for(auto [y,idx]:pasang[x]){
if(punyasiap[v].find(y)!=punyasiap[v].end()){
perlu[idx]=val;
}
}
punyasiap[v].insert(x);
}
bagus[v]=mana(bagus[v],bagus[u]);
par[u]=v;
}
int n,m,l;
const int dua=24;
int naik[dua+10][lim];
int gavalid(int x,int y){
if(1<=x && x<=n && 1<=y && y<=m) return 0;
return 1;
}
signed main(){
quick
cin>>n>>m>>l;
int angka[n+10][m+10];
memset(angka,0,sizeof(angka));
int a[n+10][m+10];
memset(a,0,sizeof(a));
vector<ti>pts;
int nm=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
pts.pb({a[i][j],i,j});
nm++;
par[nm]=nm;
punyasiap[nm].insert(nm);
sz[nm]=1;
jadi[nm]=a[i][j];
bagus[nm]={a[i][j],nm};
angka[i][j]=nm;
}
}
int q;cin>>q;
vector<tuple<int,int,int,int>>quer(1);
for(int i=1;i<=q;i++){
int aa,b,c,d;cin>>aa>>b>>c>>d;
quer.pb({aa,b,c,d});
pasang[angka[aa][b]].pb({angka[c][d],i});
pasang[angka[c][d]].pb({angka[aa][b],i});
}
priority_queue<pii,vector<pii>,greater<pii>>pq;
sort(pts.begin(),pts.end());
int cnt=1;
for(auto [val,x,y]:pts){
while(pq.size() && (pq.top().fi+l)<val){
auto [ang,idx]=pq.top();
pq.pop();
naik[0][idx]=bagus[p(idx)].se;
}
for(int i=0;i<4;i++){
int nx=x+dx[i];
int ny=y+dy[i];
if(gavalid(nx,ny) || a[nx][ny]>a[x][y]) continue;
gab(angka[nx][ny],angka[x][y],val);
}
pq.push({val,angka[x][y]});
}
while(pq.size()){
auto [ang,idx]=pq.top();
pq.pop();
naik[0][idx]=bagus[p(idx)].se;
}
for(int i=1;i<dua;i++){
for(int j=1;j<=nm;j++){
naik[i][j]=naik[i-1][naik[i-1][j]];
}
}
for(int i=1;i<=q;i++){
auto [aa,b,c,d]=quer[i];
if(!cek(angka[aa][b],angka[c][d])){
cout<<-1<<endl;
continue;
}
int ll=0,r=nm;
int jaw=-1;
while(ll<=r){
int mid=(ll+r)/2;
int sek=angka[aa][b];
int cur=mid;
for(int i=0;i<dua;i++){
if((1<<i)&cur){
cur-=(1<<i);
sek=naik[i][sek];
}
}
if(jadi[sek]+l>=perlu[i]){
jaw=mid+1;
r=mid-1;
}
else ll=mid+1;
}
cout<<jaw<<endl;
}
}