use std::collections::VecDeque; use proconio::input; fn main() { input! { h: usize, w: usize, a: usize, b: usize, r1: usize, c1: usize, r2: usize, c2: usize, p: usize, q: usize, } let mut dist = [ vec![vec![u32::MAX; w + 1]; h + 1], vec![vec![u32::MAX; w + 1]; h + 1], ]; let mut queue = VecDeque::from([(0, a, b)]); dist[0][a][b] = 0; if (r1..=r2).contains(&a) && (c1..=c2).contains(&b) { dist[1][a][b] = 0; queue.push_back((1, a, b)); } while let Some((t, i, j)) = queue.pop_front() { let d = dist[t][i][j] + 1; for (ni, nj) in [(i - 1, j), (i + 1, j), (i, j - 1), (i, j + 1)] { let mut nt = t; if (1..=h).contains(&ni) && (1..=w).contains(&nj) { if (r1..=r2).contains(&ni) && (c1..=c2).contains(&nj) { nt = 1; } if dist[nt][ni][nj] != u32::MAX { continue; } dist[nt][ni][nj] = d; queue.push_back((nt, ni, nj)); } } } let ans = dist[1][p][q] + (p.abs_diff(a) + q.abs_diff(b)) as u32; println!("{ans}"); }