fn solve(v : Vec, n : i64) -> Vec { use std::cmp::min; let mut v = v.clone(); let l = v.len(); let ncycles = n / (l as i64); let mut gv : Vec = vec![v[0]; l]; for i in 1..l { gv[i] = min(gv[i-1], v[i]); } let minv = gv[l-1]; for i in 0..l { v[i] -= minv; } for i in 0..l { gv[i] -= minv; } let mut height_length = vec![(0i64, 0i64); 0]; let mut imos1 = vec![0i64; l+1]; let mut imos0 = vec![0i64; l]; let mask = (1i64 << 30) - 1; let mut contribute = | pos : usize, t : i64, weight : i64 | { if t + (pos as i64) <= ncycles { imos0[pos] += weight * (ncycles - t); imos0[pos] &= mask; imos1[pos] -= weight; imos1[pos] &= mask; } else if t <= ncycles { let decrease_len = (ncycles - t) as usize; imos0[pos] += weight * (ncycles - t); imos0[pos] &= mask; imos1[pos] -= weight; imos1[pos] &= mask; imos1[pos - decrease_len] += weight; imos1[pos - decrease_len] &= mask; } }; for i in (0..l).rev() { if gv[i] == 0 { continue; } let mut rem = v[i]; let mut turn = 1i64; while !height_length.is_empty() && rem >= gv[i] { let (h, len) = height_length.pop().unwrap(); contribute(i, turn, -h); contribute(i, turn + len, h); if len == 0 { continue; } if h == gv[i] { turn += len; continue; } let hturn = (rem - gv[i]) / (gv[i] - h) + 1; if hturn >= len { turn += len; rem -= len * (gv[i] - h); } else { turn += hturn; rem -= hturn * (gv[i] - h); contribute(i, turn + hturn, h); contribute(i, turn + len, -h); height_length.push((h, len - hturn)); break; } } turn += rem / gv[i]; rem %= gv[i]; contribute(i, turn - 1, rem); contribute(i, turn, -rem); height_length.push((rem, 1)); turn -= 1; contribute(i, 0, gv[i]); contribute(i, turn, -gv[i]); height_length.push((gv[i], turn)); } for i in (0..l).rev() { imos1[i] = (imos1[i] + imos1[i+1]) & mask; } for i in 0..l { imos0[i] = (imos0[i] + imos1[i+1]) & mask; } imos0[0] = v[0]; let mut ans = vec![0i64; l]; let mut rem = v[0]; for i in (0..l).rev() { let x = min(imos0[i], rem); rem -= x; ans[i] = x; } ans[0] += minv; for i in 0..((n % (l as i64)) as usize) { let f = min(ans[i], v[i+1] + minv - ans[i+1]); ans[i] -= f; ans[i+1] += f; } ans } fn main(){ let mut cin = StdIStr::new(); let n : usize = cin.get(); let v : Vec = cin.vec(n); let m : i64 = cin.get(); let w = solve(v, m); use std::io::Write; let out = std::io::stdout(); let mut out = std::io::BufWriter::new(out.lock()); writeln!(out, "{}", w.iter().map(std::string::ToString::to_string).collect::>().join(" ")).unwrap(); } pub trait IStr { fn sc(&mut self) -> u8; fn gc(&mut self) -> u8; fn end(&mut self) -> bool; fn skipwc(&mut self){ while self.sc() <= (' ' as u8) { self.gc(); } } } pub trait FromIStr { fn rd(s : &mut Str) -> T; } macro_rules! impl_uint_from_istr { ($t:ty) => { impl FromIStr<$t> for $t { fn rd(s : &mut Str) -> $t { s.skipwc(); let mut x = 0 as $t; while ('0' as u8) <= s.sc() { x = x*10 + (s.gc() - '0' as u8) as $t; } x } } }; } impl_uint_from_istr!(i64); impl_uint_from_istr!(usize); struct StdIStr { buf : [u8; 65536], idx : usize, fil : usize, eof : bool } impl IStr for StdIStr { fn sc(&mut self) -> u8 { if self.eof { 0u8 } else { self.buf[self.idx] } } fn gc(&mut self) -> u8 { let res = self.sc(); self.idx += 1; if self.idx == self.fil { self.proc(); } res } fn end(&mut self) -> bool { self.eof } } impl StdIStr { fn proc(&mut self) { use std::io::Read; self.fil = std::io::stdin().read(&mut self.buf).unwrap(); self.eof = self.fil == 0; self.idx = 0; if self.eof { self.buf[0] = 0u8; } } pub fn new() -> StdIStr { let mut res = StdIStr{ buf : [0u8; 65536], idx : 0, fil : 0, eof : false }; res.proc(); res } pub fn get>(&mut self) -> T { T::rd(self) } pub fn vec>(&mut self, n : usize) -> Vec { let mut r = Vec::::new(); r.reserve(n); for _ in 0..n { r.push(self.get()); } r } }