#include<bits/stdc++.h>
using namespace std;
int n,m,q,timer=0;
int m2;
vector<vector<pair<int, int> > > g;
vector<pair<int, int> > e;
vector<int> p,sz,tin,tout,dis;
vector<bool> vis;
int anc[100001][21]={0};
int mx[100001][21]={0};
void make_set(int v){
p[v]=v;
sz[v]=1;
}
int find_set(int v){
if(p[v] == v) return v;
return find_set(p[v]);
}
bool unite(int a, int b){
a = find_set(a);
b = find_set(b);
if(a == b) return 0;
if(sz[a] < sz[b]) swap(a,b);
p[b]=a;
sz[a]+=sz[b];
return 1;
}
int na(int u, int nn, int b=20){
if(!nn) return u;
for(int i = b; i >= 0; i--){
if(nn-(1 << i) >= 0) return na(anc[u][i], nn-(1<<i), i);
}
}
int nm(int u, int nn, int b=20){
if(!nn) return 0;
if(nn==1) return mx[u][0];
for(int i = b; i >= 0; i--){
if(nn-(1 << i) >= 0) return max(mx[u][i], nm(anc[u][i], nn-(1<<i), i));
}
}
void dfs(int u, int it){
if(vis[u]) return;
tin[u]=timer++;
vis[u]=1;
if(it > 0){
anc[u][it] = anc[anc[u][it-1]][it-1];
mx[u][it]= max(mx[u][it-1], mx[anc[u][it-1]][it-1]);
}
for(pair<int, int> pr:g[u]){
if(vis[pr.second]) continue;
if(!it){
dis[pr.second]=dis[u]+1;
anc[pr.second][0]=u;
mx[pr.second][0]=pr.first;
}
dfs(pr.second, it);
}
tout[u] = timer++;
}
int solve(int a, int b){
if(dis[a] > dis[b]) swap(a,b);
if(tin[a] < tin[b] && tout[a] > tout[b]){
return nm(b, dis[b]-dis[a]);
}
int cr=0;
for(int i = 20; i >= 0; i--){
if(na(b, cr+(1 << i)) != na(a, cr+(1<<i)-dis[b]+dis[a])){
cr +=(1<<i);
}
}
cr++;
return max(nm(b,cr), nm(a,cr-dis[b]+dis[a]));
}
int main(){
cin >> n >> m >> q;
int mp[n][m];
g.resize(n*m);
p.resize(n*m);
sz.resize(n*m);
tin.resize(n*m);
tout.resize(n*m);
dis.resize(n*m);
vector<pair<int, int> > ek;
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
cin >> mp[i][j];
if(i>0){
e.push_back({max(mp[i][j], mp[i-1][j]), (i*m+j)*10});
}
if(j > 0){
e.push_back({max(mp[i][j], mp[i][j-1]), (i*m+j)*10+1});
}
}
}
sort(e.begin(), e.end());
for(int i = 0; i < n*m; i++){
make_set(i);
}
for(pair<int, int> pa:e){
if(pa.second%10){
if(unite(pa.second/10, pa.second/10-1)) ek.push_back(pa);
}else{
if(unite(pa.second/10, pa.second/10-m)) ek.push_back(pa);
}
}
for(pair<int, int> pa:ek){
if(pa.second%10){
g[pa.second/10].push_back({pa.first, pa.second/10-1});
g[pa.second/10-1].push_back({pa.first, pa.second/10});
}else{
g[pa.second/10].push_back({pa.first, pa.second/10-m});
g[pa.second/10-m].push_back({pa.first, pa.second/10});
}
}
anc[n*m/2][0]=n*m/2;
dis[n*m/2]=0;
for(int i = 0; i < 20; i++){
vis.assign(n*m, 0);
dfs(n*m/2, i);
}
while(q--){
int ai,bi,ci,di;
cin >> ai >> bi >> ci >> di;
cout << solve(ai*m+bi-m-1, ci*m+di-m-1) << endl;
}
}