rt,调了一天了,但是没看出来哪里有问题 /dk
#include <bits/stdc++.h>
//#define int ll
#define gcd __gcd
#define il inline
#define pii pair<int, int>
#define fir first
#define sec second
#define pb push_back
#define eb emplace_back
#define file(name) freopen(name".in", "r", stdin); freopen(name".out", "w", stdout);
#define rep(i, l, r) for(int i = (l); i <= (r); ++i)
#define per(i, r, l) for(int i = (r); i >= (l); --i)
using namespace std;
typedef long long ll;
const int N = 2e5 + 10, M = sqrt(N) + 10, mod = 998244353, INF = 0x3f3f3f3f;
const ll INFLL = 0x3f3f3f3f3f3f3f3f;
bool f;
int n, m, q, res[N], dis[N][M];
vector<pii> g[N];
bitset<N> vis;
il int id(int x, int y) {
return (x - 1) * m + y - 1;
}
il void adde(int x, int y, int w) {
g[x].pb({y, w}); g[y].pb({x, w});
}
struct query {
int x1, y1, x2, y2, id;
};
vector<query> v;
void solve(int l, int r, vector<query> &v) {
if(v.empty() || l > r) return ;
int mid = l + r >> 1;
vector<query> ls, rs;
// cout << "calc" << l << ' ' << r << endl;
rep(i, 1, n) {
// memset(dis, 0x3f, sizeof(dis)); vis.reset();
rep(x, 1, n) rep(y, l, r) vis[id(x, y)] = 0, dis[id(x, y)][i] = INF;
priority_queue<pii, vector<pii>, greater<pii>> q;
q.push({dis[id(i, mid)][i] = 0, id(i, mid)});
while(q.size()) {
int u = q.top().sec; q.pop();
if(vis[u]) continue;
vis[u] = 1;
for(auto [v, w] : g[u]) {
if(v % m < l - 1 || v % m > r - 1) continue;
if(dis[v][i] > dis[u][i] + w) {
dis[v][i] = dis[u][i] + w;
// cout << v << ' ' << i << '=' << dis[v][i] << endl;
if(!vis[v]) q.push({dis[v][i], v});
}
}
}
}
for(auto &i : v) if(i.y1 < mid && i.y2 < mid) ls.eb(i); else if(i.y1 > mid && i.y2 > mid) rs.eb(i); else {
rep(j, 1, n) res[i.id] = min(res[i.id], dis[id(i.x1, i.y1)][j] + dis[id(i.x2, i.y2)][j]);
}
solve(l, mid - 1, ls); solve(mid + 1, r, rs);
}
signed main() {
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> n >> m;
f = n > m;
rep(i, 1, n) rep(j, 1, m - 1) {
int r;
cin >> r;
if(f) adde(id(j, i), id(j + 1, i), r);
else adde(id(i, j), id(i, j + 1), r);
}
rep(i, 1, n - 1) rep(j, 1, m) {
int r;
cin >> r;
if(f) adde(id(j, i), id(j, i + 1), r);
else adde(id(i, j), id(i + 1, j), r);
}
cin >> q;
v.resize(q);
rep(i, 0, q - 1) {
res[v[i].id = i] = INF;
if(f) cin >> v[i].y1 >> v[i].x1 >> v[i].y2 >> v[i].x2;
else cin >> v[i].x1 >> v[i].y1 >> v[i].x2 >> v[i].y2;
}
if(f) swap(n, m);
solve(1, m, v);
rep(i, 0, q - 1) cout << res[i] << '\n';
return 0;
}