use proconio::input; use std::collections::BTreeMap; fn main() { input! { n: usize, m: usize, s: [usize; n], t: [usize; m], } let mut map = BTreeMap::new(); for i in 0..n { map.count_up(s[i], 1); } let mut left = 0; let mut right = m + 1; let mut ans = 0; 'outer: while right - left > 1 { let mid = (left + right) / 2; let mut t: Vec<_> = t[..mid].iter().cloned().collect(); t.sort(); let mut map = map.clone(); let mut cost = 0; for t in t { let Some((&acrylic_stand, _)) = map.range(t..).next() else { right = mid; continue 'outer; }; map.count_down(acrylic_stand, 1); cost = cost.max(acrylic_stand - t); } left = mid; ans = cost; } println!("{}", ans); } trait MapCounter { fn count_up(&mut self, key: K, value: usize); fn count_down(&mut self, key: K, value: usize); } impl MapCounter for BTreeMap where K: Ord, { fn count_up(&mut self, key: K, value: usize) { *self.entry(key).or_insert(0) += value; } fn count_down(&mut self, key: K, value: usize) { match self.get_mut(&key) { Some(v) => { if *v <= value { self.remove(&key); } else { *v -= value; } } None => (), } } }