module Main; // import BinaryHeap; import BoolArray; // import CPLib.Arithmetic; // import CPLib.Bipartite; // import CPLib.Bits; // import CPLib.Convolution; // import CPLib.DSegtree; // import CPLib.Graph; import CPLib.IO; // import CPLib.LDSegtree; // import CPLib.LSegtree; // import CPLib.MaxFlow; // import CPLib.Memoize; // import CPLib.MinCostFlow; // import CPLib.Misc; // import CPLib.Monoid; // import CPLib.Segtree; // import CPLib.String; // import CPLib.Trait; // import CPLib.TwoSat; // import CPLib.UnionFind; // import CPLib.ZP; // import HashMap; // import HashSet; cM : I64 = 150000; main : IO () = ( let iN = *read_i; let iAs = *read_is(iN); let cI = ( count_up(1).filter(|n| 1.shift_left(n)-1 > iAs.to_iter.sum ).get_first.as_some ); let cL = min(cI, iN); let as = iAs.get_sub(0, cL); let mx = iAs.to_iter.sum * as.@size; // let dp = fill(2, fill(as.@size + 1, fill(2 * mx + 1, false))); let dp = fill(2, fill(as.@size + 1, BoolArray::make(2*mx + 1))); // let dp = dp[0][0][0 + mx].iset(true); let dp = dp[0][0].imod(set(mx, true)); let (dp, last) = range(0, as.@size).fold((dp, as.@size), |n, (dp, last)| if dp[1][n].iget.@(mx) { let last = n; (dp, last) }; let dp = range(0, 2).fold(dp, |nz, dp| range(0, 2 * mx + 1).fold(dp, |sum_i, dp| if !dp[nz][n].iget.@(sum_i) { dp }; range(0, 3).fold(dp, |x_i, dp| let x = x_i - 1; let sum_i = sum_i + x * as.@(n); let nz = nz == 1 || x != 0; let nz = if nz { 1 } else { 0 }; dp[nz][n+1].imod(set(sum_i, true)) ) ) ); (dp, last) ); if !dp[1][last].iget.@(mx) { println("No") }; let (xs, _, _) = range_step(last, 0, -1).fold(([], 1, mx), |n, (xs, nz, v)| // dp[nz][n][v] == true let a = as.@(n-1); let (prev_nz, x) = range(0, 2).product(range(0, 3)).map(|(prev_nz, x)| (prev_nz, x - 1)).filter(|(prev_nz, x)| dp[prev_nz][n-1].iget.@(v + x * a) && (nz == 0 || prev_nz == 1 || x != 0) ).get_first.as_some; let prev_v = v + x * a; let xs = xs.push_back(x); (xs, prev_nz, prev_v) ); let xs = xs.reverse; let ans = range(0, last).map(|i| as.@(i) * xs.@(i)).to_array + fill(iN - last, 0); println("Yes");; "{}".printfln((ans.to_iter.joined_with(" "),));; pure() );