use std::collections::VecDeque; use proconio::{fastout, input}; #[fastout] fn main() { input! { n: usize, s: usize, mut a: [usize; n], } a.sort_unstable(); a.reverse(); let mut x = s; let mut v = VecDeque::new(); while x > 0 { let idx = a.partition_point(|&p| p >= x); if idx == n { break; } x -= a[idx] + 1; v.push_back((idx, a[idx] + 1)); } for i in 1..v.len() { if v[i].0 <= v[i - 1].0 { v[i] = (v[i - 1].0 + 1, v[i].1); } } if v.is_empty() { println!("{}", a.iter().sum::()); return; } let mut ans = 0; let mut cnt = 0; while cnt < n { let mut nv = VecDeque::new(); for _ in 0..v.len() { let (idx, x) = v.pop_front().unwrap(); if idx >= n { continue; } if a[idx] == 0 { continue; } if x > a[idx] { cnt += 1; a[idx] = 0; if idx + 1 < n { nv.push_back((idx + 1, x)); } else if idx > 0 { nv.push_back((idx - 1, x)); } else { continue; } } else { a[idx] -= 1; if a[idx] == 0 { cnt += 1; if idx > 0 { nv.push_back((idx - 1, x)); } } } } v = nv; ans += 1; } println!("{}", ans); }