use std::collections::BTreeMap; use itertools::Itertools; use proconio::input; fn main() { input! { n: usize, m: usize, s: [usize; n], t: [usize; m], } let mut s_map = BTreeMap::new(); for &s_i in &s { *s_map.entry(s_i).or_insert(0) += 1_usize; } let mut ss_map = s_map.clone(); let mut end_j = m; for (j, &t_j) in t.iter().enumerate() { if let Some((&s_j, &cnt)) = s_map.range(t_j..).next() { if cnt == 1 { s_map.remove(&s_j); } else { s_map.insert(s_j, cnt - 1); } } else { end_j = j; break; } } let mut tt = t[..end_j].iter().collect_vec().clone(); tt.sort(); let mut ans: usize = 0; for &t_j in &tt { if let Some((&s_j, &cnt)) = ss_map.range(t_j..).next() { ans = ans.max(s_j - t_j); if cnt == 1 { ss_map.remove(&s_j); } else { ss_map.insert(s_j, cnt - 1); } } } println!("{}", ans); }