use std::collections::BinaryHeap; use proconio::input; fn main() { input! { n: usize, h: [usize; n], } let mut left = 0; let mut right = n + 1000; while right - left > 1 { let mid = (left + right) / 2; let mut h: BinaryHeap = h.iter().cloned().collect(); for exp in (0..mid as u32).rev() { if h.len() == 0 { break; } if exp > 60 { h.pop(); } else { let pop = h.pop().unwrap(); if pop > 2usize.pow(exp) { h.push(pop - 2usize.pow(exp)); } } } if h.len() == 0 { right = mid; } else { left = mid; } } println!("{}", right); }