use std::collections::BTreeSet; use itertools::{Itertools, enumerate}; use proconio::input; const INF: i64 = 10_i64.pow(10); fn main() { input! { n: usize, xy: [(i64, i64); n], } let mut uv = xy.iter().map(|&(x, y)| (x - y, x + y)).collect_vec(); let mut min_d = INF; for _ in 0..4 { let min_u = uv.iter().map(|v| v.0).min().unwrap(); let min_v = uv.iter().map(|v| v.1).min().unwrap(); uv.iter_mut().for_each(|(u, v)| { *u -= min_u; *v -= min_v }); uv.sort_unstable_by_key(|&(u, v)| u.max(v)); let mut u_set = BTreeSet::from_iter(enumerate(&uv).map(|(i, v)| (v.0, i))); let mut v_set = BTreeSet::from_iter(enumerate(&uv).map(|(i, v)| (v.1, i))); let mut len = 0; for (i, &(u, v)) in enumerate(&uv) { let dist_u = u_set.last().unwrap().0 - u_set.first().unwrap().0; let dist_v = v_set.last().unwrap().0 - v_set.first().unwrap().0; min_d = min_d.min(len.max(dist_u).max(dist_v)); len = u.max(v); u_set.remove(&(u, i)); v_set.remove(&(v, i)); } uv.iter_mut().for_each(|(u, v)| (*u, *v) = (-*v, *u)); } println!("{min_d}"); }