use std::mem::swap; use proconio::{fastout, input}; #[fastout] fn main() { input! { t: usize, cases: [(usize,usize,usize,usize); t], } let idx = |x: usize, y: usize| (y, x / (1 << (y.min(60)))); for (sx, sy, tx, ty) in cases { let (mut l, mut r) = (idx(sx, sy), idx(tx, ty)); if sx > tx { swap(&mut l, &mut r); } let mut tmp = 0; let mut ans = usize::MAX; while l.0 != r.0 { if l.1 == 0 && r.1 == 0 { tmp += l.0.abs_diff(r.0); let m = l.0.max(r.0); l = (m, 0); r = (m, 0); break; } if l.0 < r.0 { l = (l.0 + 1, l.1 / 2); } else { r = (r.0 + 1, r.1 / 2); } tmp += 1; } while l != r { if l.1 == 0 && r.1 == 0 { break; } ans = ans.min(tmp + l.1.abs_diff(r.1)); l = (l.0 + 1, l.1 / 2); r = (r.0 + 1, r.1 / 2); tmp += 2; } ans = ans.min(tmp); println!("{}", ans); } }