#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define el cout << '\n'
const int MAXN = 5;
const int MAXM = 100000;
const int MAXQ = 100000;
const ll INF = (ll)4e18; // lớn hơn tổng chi phí khả dĩ
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 + 5][MAXM + 5];
static ll dist_arr[MAXN + 5][MAXN + 5][MAXM + 5]; // dist[id][row][col]
ll ans[MAXQ + 5];
vector<Query> qrs;
inline void dijkstra(int id, int L, int R, int sx, int sy) {
// set INF for the needed columns [L..R] for all rows
for (int i = 1; i <= n; ++i) {
// dist_arr[id][i] + L..R are contiguous in memory (last index varies fastest)
std::fill(dist_arr[id][i] + L, dist_arr[id][i] + R + 1, INF);
}
priority_queue<Node, vector<Node>, greater<Node>> pq;
dist_arr[id][sx][sy] = a[sx][sy];
pq.push(Node(sx, sy, dist_arr[id][sx][sy]));
while (!pq.empty()) {
Node cur = pq.top(); pq.pop();
int x = cur.x, y = cur.y;
ll d = cur.dist;
if (d != dist_arr[id][x][y]) continue;
for (int k = 0; k < 4; ++k) {
int nx = x + dx[k], ny = y + dy[k];
if (nx < 1 || nx > n || ny < L || ny > R) continue;
ll nd = d + a[nx][ny];
if (nd < dist_arr[id][nx][ny]) {
dist_arr[id][nx][ny] = nd;
pq.push(Node(nx, ny, nd));
}
}
}
}
void dnc(int L, int R, vector<Query> &vec) {
if (vec.empty()) return;
int mid = (L + R) >> 1; // **SỬA**: dùng mid đúng (không phải l + r >> 1)
// Chạy Dijkstra từ mỗi hàng (row) với nguồn là cột mid
for (int row = 1; row <= n; ++row) {
dijkstra(row, L, R, row, mid);
}
// Cập nhật câu trả lời bằng cách thử mọi row làm "điểm nối" qua cột mid
for (const Query &qr : vec) {
for (int row = 1; row <= n; ++row) {
// dist_arr[row][x][y] + dist_arr[row][u][v] - a[row][mid]
ll cand = dist_arr[row][qr.x][qr.y];
ll cand2 = dist_arr[row][qr.u][qr.v];
if (cand >= INF || cand2 >= INF) continue;
ll total = cand + cand2 - a[row][mid];
if (total < ans[qr.id]) ans[qr.id] = total;
}
}
if (L == R) return;
int M = mid;
vector<Query> left_qs; left_qs.reserve(vec.size());
vector<Query> right_qs; right_qs.reserve(vec.size());
for (const Query &qr : vec) {
if (qr.v <= M) left_qs.push_back(qr);
else if (qr.y > M) right_qs.push_back(qr);
else {
// trường hợp đường đi giao nhau hai phía: vẫn đã được cập nhật ở trên (qua mid)
// không cần push xuống con nào vì câu trả lời đã xét qua mid
}
}
dnc(L, M, left_qs);
dnc(M+1, R, right_qs);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
// Hỗ trợ đọc từ file nếu có (giữ nguyên ý định ban đầu)
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;
qrs.reserve(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); } // đảm bảo y <= v
qrs.push_back(Query(x,y,u,v,i));
ans[i] = INF;
}
dnc(1, m, qrs);
for (int i = 1; i <= q; ++i) {
cout << ans[i] << '\n';
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIGxsIGxvbmcgbG9uZwojZGVmaW5lIGVsIGNvdXQgPDwgJ1xuJwoKY29uc3QgaW50IE1BWE4gPSA1Owpjb25zdCBpbnQgTUFYTSA9IDEwMDAwMDsKY29uc3QgaW50IE1BWFEgPSAxMDAwMDA7CmNvbnN0IGxsIElORiA9IChsbCk0ZTE4OyAvLyBs4bubbiBoxqFuIHThu5VuZyBjaGkgcGjDrSBraOG6oyBkxKkKCmNvbnN0IGludCBkeFtdID0gezAsIDEsIDAsIC0xfTsKY29uc3QgaW50IGR5W10gPSB7MSwgMCwgLTEsIDB9OwoKc3RydWN0IFF1ZXJ5IHsKICAgIGludCB4LCB5LCB1LCB2LCBpZDsKICAgIFF1ZXJ5KGludCB4PTAsaW50IHk9MCxpbnQgdT0wLGludCB2PTAsaW50IGlkPTApOngoeCkseSh5KSx1KHUpLHYodiksaWQoaWQpe30KfTsKc3RydWN0IE5vZGUgewogICAgaW50IHgsIHk7CiAgICBsbCBkaXN0OwogICAgTm9kZShpbnQgeD0wLGludCB5PTAsbGwgZGlzdD0wKTp4KHgpLHkoeSksZGlzdChkaXN0KXt9CiAgICBib29sIG9wZXJhdG9yPihjb25zdCBOb2RlICZvdGhlcikgY29uc3QgeyByZXR1cm4gZGlzdCA+IG90aGVyLmRpc3Q7IH0KfTsKCmludCBuLCBtLCBxOwpsbCBhW01BWE4gKyA1XVtNQVhNICsgNV07CnN0YXRpYyBsbCBkaXN0X2FycltNQVhOICsgNV1bTUFYTiArIDVdW01BWE0gKyA1XTsgLy8gZGlzdFtpZF1bcm93XVtjb2xdCmxsIGFuc1tNQVhRICsgNV07CnZlY3RvcjxRdWVyeT4gcXJzOwoKaW5saW5lIHZvaWQgZGlqa3N0cmEoaW50IGlkLCBpbnQgTCwgaW50IFIsIGludCBzeCwgaW50IHN5KSB7CiAgICAvLyBzZXQgSU5GIGZvciB0aGUgbmVlZGVkIGNvbHVtbnMgW0wuLlJdIGZvciBhbGwgcm93cwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgKytpKSB7CiAgICAgICAgLy8gZGlzdF9hcnJbaWRdW2ldICsgTC4uUiBhcmUgY29udGlndW91cyBpbiBtZW1vcnkgKGxhc3QgaW5kZXggdmFyaWVzIGZhc3Rlc3QpCiAgICAgICAgc3RkOjpmaWxsKGRpc3RfYXJyW2lkXVtpXSArIEwsIGRpc3RfYXJyW2lkXVtpXSArIFIgKyAxLCBJTkYpOwogICAgfQoKICAgIHByaW9yaXR5X3F1ZXVlPE5vZGUsIHZlY3RvcjxOb2RlPiwgZ3JlYXRlcjxOb2RlPj4gcHE7CiAgICBkaXN0X2FycltpZF1bc3hdW3N5XSA9IGFbc3hdW3N5XTsKICAgIHBxLnB1c2goTm9kZShzeCwgc3ksIGRpc3RfYXJyW2lkXVtzeF1bc3ldKSk7CgogICAgd2hpbGUgKCFwcS5lbXB0eSgpKSB7CiAgICAgICAgTm9kZSBjdXIgPSBwcS50b3AoKTsgcHEucG9wKCk7CiAgICAgICAgaW50IHggPSBjdXIueCwgeSA9IGN1ci55OwogICAgICAgIGxsIGQgPSBjdXIuZGlzdDsKICAgICAgICBpZiAoZCAhPSBkaXN0X2FycltpZF1beF1beV0pIGNvbnRpbnVlOwoKICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDQ7ICsraykgewogICAgICAgICAgICBpbnQgbnggPSB4ICsgZHhba10sIG55ID0geSArIGR5W2tdOwogICAgICAgICAgICBpZiAobnggPCAxIHx8IG54ID4gbiB8fCBueSA8IEwgfHwgbnkgPiBSKSBjb250aW51ZTsKICAgICAgICAgICAgbGwgbmQgPSBkICsgYVtueF1bbnldOwogICAgICAgICAgICBpZiAobmQgPCBkaXN0X2FycltpZF1bbnhdW255XSkgewogICAgICAgICAgICAgICAgZGlzdF9hcnJbaWRdW254XVtueV0gPSBuZDsKICAgICAgICAgICAgICAgIHBxLnB1c2goTm9kZShueCwgbnksIG5kKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCnZvaWQgZG5jKGludCBMLCBpbnQgUiwgdmVjdG9yPFF1ZXJ5PiAmdmVjKSB7CiAgICBpZiAodmVjLmVtcHR5KCkpIHJldHVybjsKICAgIGludCBtaWQgPSAoTCArIFIpID4+IDE7IC8vICoqU+G7rEEqKjogZMO5bmcgbWlkIMSRw7puZyAoa2jDtG5nIHBo4bqjaSBsICsgciA+PiAxKQoKICAgIC8vIENo4bqheSBEaWprc3RyYSB04burIG3hu5dpIGjDoG5nIChyb3cpIHbhu5tpIG5ndeG7k24gbMOgIGPhu5l0IG1pZAogICAgZm9yIChpbnQgcm93ID0gMTsgcm93IDw9IG47ICsrcm93KSB7CiAgICAgICAgZGlqa3N0cmEocm93LCBMLCBSLCByb3csIG1pZCk7CiAgICB9CgogICAgLy8gQ+G6rXAgbmjhuq10IGPDonUgdHLhuqMgbOG7nWkgYuG6sW5nIGPDoWNoIHRo4butIG3hu41pIHJvdyBsw6BtICLEkWnhu4NtIG7hu5FpIiBxdWEgY+G7mXQgbWlkCiAgICBmb3IgKGNvbnN0IFF1ZXJ5ICZxciA6IHZlYykgewogICAgICAgIGZvciAoaW50IHJvdyA9IDE7IHJvdyA8PSBuOyArK3JvdykgewogICAgICAgICAgICAvLyBkaXN0X2Fycltyb3ddW3hdW3ldICsgZGlzdF9hcnJbcm93XVt1XVt2XSAtIGFbcm93XVttaWRdCiAgICAgICAgICAgIGxsIGNhbmQgPSBkaXN0X2Fycltyb3ddW3FyLnhdW3FyLnldOwogICAgICAgICAgICBsbCBjYW5kMiA9IGRpc3RfYXJyW3Jvd11bcXIudV1bcXIudl07CiAgICAgICAgICAgIGlmIChjYW5kID49IElORiB8fCBjYW5kMiA+PSBJTkYpIGNvbnRpbnVlOwogICAgICAgICAgICBsbCB0b3RhbCA9IGNhbmQgKyBjYW5kMiAtIGFbcm93XVttaWRdOwogICAgICAgICAgICBpZiAodG90YWwgPCBhbnNbcXIuaWRdKSBhbnNbcXIuaWRdID0gdG90YWw7CiAgICAgICAgfQogICAgfQoKICAgIGlmIChMID09IFIpIHJldHVybjsKCiAgICBpbnQgTSA9IG1pZDsKICAgIHZlY3RvcjxRdWVyeT4gbGVmdF9xczsgbGVmdF9xcy5yZXNlcnZlKHZlYy5zaXplKCkpOwogICAgdmVjdG9yPFF1ZXJ5PiByaWdodF9xczsgcmlnaHRfcXMucmVzZXJ2ZSh2ZWMuc2l6ZSgpKTsKCiAgICBmb3IgKGNvbnN0IFF1ZXJ5ICZxciA6IHZlYykgewogICAgICAgIGlmIChxci52IDw9IE0pIGxlZnRfcXMucHVzaF9iYWNrKHFyKTsKICAgICAgICBlbHNlIGlmIChxci55ID4gTSkgcmlnaHRfcXMucHVzaF9iYWNrKHFyKTsKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLy8gdHLGsOG7nW5nIGjhu6NwIMSRxrDhu51uZyDEkWkgZ2lhbyBuaGF1IGhhaSBwaMOtYTogduG6q24gxJHDoyDEkcaw4bujYyBj4bqtcCBuaOG6rXQg4bufIHRyw6puIChxdWEgbWlkKQogICAgICAgICAgICAvLyBraMO0bmcgY+G6p24gcHVzaCB4deG7kW5nIGNvbiBuw6BvIHbDrCBjw6J1IHRy4bqjIGzhu51pIMSRw6MgeMOpdCBxdWEgbWlkCiAgICAgICAgfQogICAgfQoKICAgIGRuYyhMLCBNLCBsZWZ0X3FzKTsKICAgIGRuYyhNKzEsIFIsIHJpZ2h0X3FzKTsKfQoKaW50IG1haW4oKSB7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKG51bGxwdHIpOwoKICAgIC8vIEjhu5cgdHLhu6MgxJHhu41jIHThu6sgZmlsZSBu4bq/dSBjw7MgKGdp4buvIG5ndXnDqm4gw70gxJHhu4tuaCBiYW4gxJHhuqd1KQogICAgaWYgKGZvcGVuKCJTSE9SVEVTVC5JTlAiLCAiciIpKSB7CiAgICAgICAgZnJlb3BlbigiU0hPUlRFU1QuSU5QIiwgInIiLCBzdGRpbik7CiAgICAgICAgZnJlb3BlbigiU0hPUlRFU1QuT1VUIiwgInciLCBzdGRvdXQpOwogICAgfQoKICAgIGNpbiA+PiBuID4+IG07CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyArK2kpCiAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPD0gbTsgKytqKQogICAgICAgICAgICBjaW4gPj4gYVtpXVtqXTsKCiAgICBjaW4gPj4gcTsKICAgIHFycy5yZXNlcnZlKHEpOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gcTsgKytpKSB7CiAgICAgICAgaW50IHgseSx1LHY7IGNpbiA+PiB4ID4+IHkgPj4gdSA+PiB2OwogICAgICAgIGlmICh5ID4gdikgeyBzd2FwKHgsdSk7IHN3YXAoeSx2KTsgfSAvLyDEkeG6o20gYuG6o28geSA8PSB2CiAgICAgICAgcXJzLnB1c2hfYmFjayhRdWVyeSh4LHksdSx2LGkpKTsKICAgICAgICBhbnNbaV0gPSBJTkY7CiAgICB9CgogICAgZG5jKDEsIG0sIHFycyk7CgogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gcTsgKytpKSB7CiAgICAgICAgY291dCA8PCBhbnNbaV0gPDwgJ1xuJzsKICAgIH0KICAgIHJldHVybiAwOwp9Cg==