#include <bits/stdc++.h>
#define ll long long
#define el cout << '\n'
using namespace std;
const int maxn = 5;
const int maxm = 1e5;
const int maxq = 1e5;
const ll INF = 1e18;
const int dx[] = {0, 1, 0, -1};
const int dy[] = {1, 0, -1, 0};
struct Query
{
int x, y, u, v, id;
Query(int x = 0, int y = 0, int u = 0, int v = 0, int id = 0) :
x(x), y(y), u(u), v(v), id(id) {};
};
struct Node
{
int x, y;
ll dist;
Node(int x = 0, int y = 0, ll dist = 0) :
x(x), y(y), dist(dist) {};
bool operator > (const Node &other) const
{
return dist > other.dist;
}
};
int n, m, q;
ll a[maxn + 10][maxm + 10], dist[maxn + 10][maxn + 10][maxm + 10], ans[maxq + 10];
vector<Query> qrs;
void dijkstra(int id, int l, int r, int x, int y)
{
for (int i = 1; i <= n; i++)
fill(dist[id][i] + l, dist[id][i] + r + 1, INF);
priority_queue<Node, vector<Node>, greater<Node>> pq;
dist[id][x][y] = a[x][y];
pq.push(Node(x, y, a[x][y]));
while (pq.size())
{
Node t = pq.top();
pq.pop();
int x = t.x;
int y = t.y;
ll d = t.dist;
if (d > dist[id][x][y])
continue;
for (int k = 0; k < 4; k++)
{
int nxt_x = x + dx[k];
int nxt_y = y + dy[k];
if (nxt_y > r || nxt_y < l || nxt_x < 1 || nxt_x > n)
continue;
if (dist[id][nxt_x][nxt_y] > dist[id][x][y] + a[nxt_x][nxt_y])
{
dist[id][nxt_x][nxt_y] = dist[id][x][y] + a[nxt_x][nxt_y];
pq.push(Node(nxt_x, nxt_y, dist[id][nxt_x][nxt_y]));
}
}
}
}
void dnc(int l, int r, vector<Query> & qrs)
{
if (qrs.empty())
return ;
int m = l + r >> 1;
for (int i = 1; i <= n; i++)
dijkstra(i, l, r, i, m);
for (const Query &qr : qrs)
for (int i = 1; i <= n; i++)
ans[qr.id] = min(ans[qr.id], dist[i][qr.x][qr.y] + dist[i][qr.u][qr.v] - a[i][m]);
if (l == r)
return ;
vector<Query> left_qrs, right_qrs;
for (const Query &qr : qrs)
{
if (qr.v <= m)
left_qrs.push_back(qr);
if (qr.y > m)
right_qrs.push_back(qr);
}
dnc(l, m, left_qrs);
dnc(m + 1, r, right_qrs);
}
int main()
{
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
if (fopen("SHORTEST.INP", "r"))
{
freopen("SHORTEST.INP", "r", stdin);
freopen("SHORTEST.OUT", "w", stdout);
}
cin >> n >> m;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
cin >> a[i][j];
cin >> q;
for (int i = 1; i <= q; i++)
{
int x, y, u, v;
cin >> x >> y >> u >> v;
if (y > v)
{
swap(x, u);
swap(y, v);
}
ans[i] = INF;
qrs.push_back(Query(x, y, u, v, i));
}
dnc(1, m, qrs);
for (int i = 1; i <= q; i++)
cout << ans[i], el;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CgojZGVmaW5lIGxsIGxvbmcgbG9uZwojZGVmaW5lIGVsIGNvdXQgPDwgJ1xuJwoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNvbnN0IGludCBtYXhuID0gNTsKY29uc3QgaW50IG1heG0gPSAxZTU7CmNvbnN0IGludCBtYXhxID0gMWU1Owpjb25zdCBsbCBJTkYgPSAxZTE4Owpjb25zdCBpbnQgZHhbXSA9IHswLCAxLCAwLCAtMX07CmNvbnN0IGludCBkeVtdID0gezEsIDAsIC0xLCAwfTsKCnN0cnVjdCBRdWVyeQp7CiAgICBpbnQgeCwgeSwgdSwgdiwgaWQ7CgogICAgUXVlcnkoaW50IHggPSAwLCBpbnQgeSA9IDAsIGludCB1ID0gMCwgaW50IHYgPSAwLCBpbnQgaWQgPSAwKSA6CiAgICAgICAgeCh4KSwgeSh5KSwgdSh1KSwgdih2KSwgaWQoaWQpIHt9Owp9OwpzdHJ1Y3QgTm9kZQp7CiAgICBpbnQgeCwgeTsKICAgIGxsIGRpc3Q7CgogICAgTm9kZShpbnQgeCA9IDAsIGludCB5ID0gMCwgbGwgZGlzdCA9IDApIDoKICAgICAgICB4KHgpLCB5KHkpLCBkaXN0KGRpc3QpIHt9OwogICAgYm9vbCBvcGVyYXRvciA+IChjb25zdCBOb2RlICZvdGhlcikgY29uc3QKICAgIHsKICAgICAgICByZXR1cm4gZGlzdCA+IG90aGVyLmRpc3Q7CiAgICB9Cn07CgppbnQgbiwgbSwgcTsKbGwgYVttYXhuICsgMTBdW21heG0gKyAxMF0sIGRpc3RbbWF4biArIDEwXVttYXhuICsgMTBdW21heG0gKyAxMF0sIGFuc1ttYXhxICsgMTBdOwp2ZWN0b3I8UXVlcnk+IHFyczsKCnZvaWQgZGlqa3N0cmEoaW50IGlkLCBpbnQgbCwgaW50IHIsIGludCB4LCBpbnQgeSkKewogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKQogICAgICAgIGZpbGwoZGlzdFtpZF1baV0gKyBsLCBkaXN0W2lkXVtpXSArIHIgKyAxLCBJTkYpOwogICAgcHJpb3JpdHlfcXVldWU8Tm9kZSwgdmVjdG9yPE5vZGU+LCBncmVhdGVyPE5vZGU+PiBwcTsKICAgIGRpc3RbaWRdW3hdW3ldID0gYVt4XVt5XTsKICAgIHBxLnB1c2goTm9kZSh4LCB5LCBhW3hdW3ldKSk7CgogICAgd2hpbGUgKHBxLnNpemUoKSkKICAgIHsKICAgICAgICBOb2RlIHQgPSBwcS50b3AoKTsKICAgICAgICBwcS5wb3AoKTsKICAgICAgICBpbnQgeCA9IHQueDsKICAgICAgICBpbnQgeSA9IHQueTsKICAgICAgICBsbCBkID0gdC5kaXN0OwoKICAgICAgICBpZiAoZCA+IGRpc3RbaWRdW3hdW3ldKQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDQ7IGsrKykKICAgICAgICB7CiAgICAgICAgICAgIGludCBueHRfeCA9IHggKyBkeFtrXTsKICAgICAgICAgICAgaW50IG54dF95ID0geSArIGR5W2tdOwogICAgICAgICAgICBpZiAobnh0X3kgPiByIHx8IG54dF95IDwgbCB8fCBueHRfeCA8IDEgfHwgbnh0X3ggPiBuKQogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIGlmIChkaXN0W2lkXVtueHRfeF1bbnh0X3ldID4gZGlzdFtpZF1beF1beV0gKyBhW254dF94XVtueHRfeV0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRpc3RbaWRdW254dF94XVtueHRfeV0gPSBkaXN0W2lkXVt4XVt5XSArIGFbbnh0X3hdW254dF95XTsKICAgICAgICAgICAgICAgIHBxLnB1c2goTm9kZShueHRfeCwgbnh0X3ksIGRpc3RbaWRdW254dF94XVtueHRfeV0pKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKdm9pZCBkbmMoaW50IGwsIGludCByLCB2ZWN0b3I8UXVlcnk+ICYgcXJzKQp7CiAgICBpZiAocXJzLmVtcHR5KCkpCiAgICAgICAgcmV0dXJuIDsKICAgIGludCBtID0gbCArIHIgPj4gMTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykKICAgICAgICBkaWprc3RyYShpLCBsLCByLCBpLCBtKTsKICAgIGZvciAoY29uc3QgUXVlcnkgJnFyIDogcXJzKQogICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykKICAgICAgICAgICAgYW5zW3FyLmlkXSA9IG1pbihhbnNbcXIuaWRdLCBkaXN0W2ldW3FyLnhdW3FyLnldICsgZGlzdFtpXVtxci51XVtxci52XSAtIGFbaV1bbV0pOwogICAgaWYgKGwgPT0gcikKICAgICAgICByZXR1cm4gOwogICAgdmVjdG9yPFF1ZXJ5PiBsZWZ0X3FycywgcmlnaHRfcXJzOwoKICAgIGZvciAoY29uc3QgUXVlcnkgJnFyIDogcXJzKQogICAgewogICAgICAgIGlmIChxci52IDw9IG0pCiAgICAgICAgICAgIGxlZnRfcXJzLnB1c2hfYmFjayhxcik7CiAgICAgICAgaWYgKHFyLnkgPiBtKQogICAgICAgICAgICByaWdodF9xcnMucHVzaF9iYWNrKHFyKTsKICAgIH0KICAgIGRuYyhsLCBtLCBsZWZ0X3Fycyk7CiAgICBkbmMobSArIDEsIHIsIHJpZ2h0X3Fycyk7Cn0KCmludCBtYWluKCkKewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKTsgY2luLnRpZSgwKTsgY291dC50aWUoMCk7CiAgICBpZiAoZm9wZW4oIlNIT1JURVNULklOUCIsICJyIikpCiAgICB7CiAgICAgICAgZnJlb3BlbigiU0hPUlRFU1QuSU5QIiwgInIiLCBzdGRpbik7CiAgICAgICAgZnJlb3BlbigiU0hPUlRFU1QuT1VUIiwgInciLCBzdGRvdXQpOwogICAgfQoKICAgIGNpbiA+PiBuID4+IG07CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspCiAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPD0gbTsgaisrKQogICAgICAgICAgICBjaW4gPj4gYVtpXVtqXTsKICAgIGNpbiA+PiBxOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gcTsgaSsrKQogICAgewogICAgICAgIGludCB4LCB5LCB1LCB2OwogICAgICAgIGNpbiA+PiB4ID4+IHkgPj4gdSA+PiB2OwogICAgICAgIGlmICh5ID4gdikKICAgICAgICB7CiAgICAgICAgICAgIHN3YXAoeCwgdSk7CiAgICAgICAgICAgIHN3YXAoeSwgdik7CiAgICAgICAgfQogICAgICAgIGFuc1tpXSA9IElORjsKICAgICAgICBxcnMucHVzaF9iYWNrKFF1ZXJ5KHgsIHksIHUsIHYsIGkpKTsKICAgIH0KICAgIGRuYygxLCBtLCBxcnMpOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gcTsgaSsrKQogICAgICAgIGNvdXQgPDwgYW5zW2ldLCBlbDsKfQo=