use std::collections::BTreeSet; use itertools::Itertools; use proconio::input; const INF: i64 = 10_i64.pow(10); fn main() { input! { n: usize, mut xy: [(i64, i64); n], } let xy = xy .iter() .map(|&(x, y)| (x - y, x + y)) .sorted_unstable() .collect_vec(); let mut min_d_1 = INF; let mut set1 = BTreeSet::<(i64, usize)>::new(); let mut set2 = BTreeSet::<(i64, usize)>::from_iter(xy.iter().enumerate().map(|(i, v)| (v.1, i))); for (i, &(_, y)) in xy.iter().enumerate() { let d1 = if i == 0 { 0 } else { let min_y = set1.first().unwrap().0; let max_y = set1.last().unwrap().0; (xy[i - 1].0 - xy[0].0).max(max_y - min_y) }; let d2 = { let min_y = set2.first().unwrap().0; let max_y = set2.last().unwrap().0; (xy[n - 1].0 - xy[i].0).max(max_y - min_y) }; min_d_1 = min_d_1.min(d1.max(d2)); set1.insert((y, i)); set2.remove(&(y, i)); } let xy = xy .iter() .map(|&(x, y)| (y, x)) .sorted_unstable() .collect_vec(); let mut min_d_2 = INF; let mut set1 = BTreeSet::<(i64, usize)>::new(); let mut set2 = BTreeSet::<(i64, usize)>::from_iter(xy.iter().enumerate().map(|(i, v)| (v.1, i))); for (i, &(_, y)) in xy.iter().enumerate() { let d1 = if i == 0 { 0 } else { let min_y = set1.first().unwrap().0; let max_y = set1.last().unwrap().0; (xy[i - 1].0 - xy[0].0).max(max_y - min_y) }; let d2 = { let min_y = set2.first().unwrap().0; let max_y = set2.last().unwrap().0; (xy[n - 1].0 - xy[i].0).max(max_y - min_y) }; min_d_2 = min_d_2.min(d1.max(d2)); set1.insert((y, i)); set2.remove(&(y, i)); } println!("{}", min_d_1.min(min_d_2)); }