//#define _GLIBCXX_DEBUG #include using namespace std; #define rep(i, n) for (ll i = 0; i < (ll)(n); i++) #define all(a) (a).begin(), (a).end() using ll = long long; const ll INF32 = 2e9; const ll INF64 = 4e18; void printYN(bool ok){ if(ok)cout << "Yes" << endl; else cout << "No" << endl; return; } struct point { int w, r, c; point(int _w, int _r, int _c){ w = _w; r = _r; c = _c; } }; int main() { int H, W; cin >> H >> W; int A, B; cin >> A >> B; A--; B--; int R1, C1, R2, C2; cin >> R1 >> C1 >> R2 >> C2; R1--; C1--; R1--; C2--; int P, Q; cin >> P >> Q; P--; Q--; vector>> dist(3, vector>(H, vector(W,INF32))); deque dq; dq.push_front(point(0, A, B)); dist[0][A][B] = 0; const vector dr = {1, 0, -1, 0}, dc = {0, 1, 0, -1}; while(!dq.empty()){ auto [w, r, c] = dq.front(); dq.pop_front(); rep(k, 4){ int nr = r + dr[k], nc = c+dc[k]; if(nr<0||H<=nr||nc<0||W<=nc)continue; if(dist[w][nr][nc]!=INF32)continue; dist[w][nr][nc] = dist[w][r][c]+1; dq.push_back(point(w, nr, nc)); } if(w==0&&R1<=r&&r<=R2&&C1<=c&&c<=C2){ if(dist[w+1][r][c]==INF32)dist[w+1][r][c] = dist[w][r][c]; dq.push_front(point(w+1,r,c)); } if(w==1&&P==r&&Q==c){ if(dist[w+1][r][c]==INF32)dist[w+1][r][c] = dist[w][r][c]; dq.push_front(point(w+1,r,c)); } } cout << dist[2][A][B] << endl; return 0; }