1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
| #include <bits/stdc++.h> #define init(x) memset (x,0,sizeof (x)) #define ll long long #define ull unsigned long long using namespace std; const int M = 1e6; const int MAXN = 505; const int MAXQ = 2e5 + 5; const int MOD = 1e9 + 7; inline int read (); int n,m,q,fl; int fa[M + 5],sx[MAXQ],sy[MAXQ],sh[MAXQ],fx[MAXQ],fy[MAXQ],fh[MAXQ],l[MAXQ],r[MAXQ],ans[MAXQ],a[MAXN][MAXN]; vector <pair <int,int> > f[M + 5]; vector <int> res[M + 5]; int getfa (int u) {return fa[u] == u ? u : fa[u] = getfa (fa[u]);} void merge (int u,int v) { u = getfa (u),v = getfa (v); if (u != v) fa[u] = v; } int main () { n = read ();m = read (); for (int i = 1;i <= n;++i) for (int j = 1;j <= m;++j) a[i][j] = read (); for (int i = 1;i <= n;++i) { for (int j = 1;j <= m;++j) { if (i != n) f[min (a[i][j],a[i + 1][j])].push_back ({(i - 1) * m + j,i * m + j}); if (j != m) f[min (a[i][j],a[i][j + 1])].push_back ({(i - 1) * m + j,(i - 1) * m + j + 1}); } } q = read (); for (int i = 1;i <= q;++i) { sx[i] = read (),sy[i] = read (),sh[i] = read (); fx[i] = read (),fy[i] = read (),fh[i] = read (); l[i] = 1,r[i] = min (sh[i],fh[i]); } while (!fl) { fl = 1; for (int i = 1;i <= q;++i) { if (l[i] > r[i]) continue; int mid = (l[i] + r[i]) >> 1; res[mid].push_back (i); fl = 0; } for (int i = 1;i <= M;++i) fa[i] = i; for (int i = M;i >= 1;--i) { for (auto item : f[i]) merge (item.first,item.second); for (auto p : res[i]) { int u = (sx[p] - 1) * m + sy[p],v = (fx[p] - 1) * m + fy[p]; u = getfa (u),v = getfa (v); if (u == v) ans[p] = i,l[p] = i + 1; else r[p] = i - 1; } } for (int i = 1;i <= M;++i) res[i].clear (); } for (int i = 1;i <= q;++i) printf ("%d\n",sh[i] + fh[i] - 2 * ans[i]); return 0; } inline int read () { int s = 0;int f = 1; char ch = getchar (); while ((ch < '0' || ch > '9') && ch != EOF) { if (ch == '-') f = -1; ch = getchar (); } while (ch >= '0' && ch <= '9') { s = s * 10 + ch - '0'; ch = getchar (); } return s * f; }
|