use proconio::input; fn main() { input! { n: usize, k: u32, a: [u64; n], c: [u32; n], } let mut dp = vec![vec![0u64; n]; n]; for (i, &c) in c.iter().enumerate() { dp[(i + 1) % n][i] = 1 << c; } for d in 2..=n { for e in 1..d { for l in 0..n { let c = (l + e) % n; let r = (l + d) % n; let x = dp[c][l]; let y = dp[r][c]; dp[r][l] |= (x | y) & (0..=2 * k).fold(0, |acc, p| acc | x << p >> k) & (0..=2 * k).fold(0, |acc, p| acc | y << p >> k); } } } let mut ans = 0; for l in 0..n { let mut sum = a[l]; for r in (l + 1..n).chain(0..l) { if dp[r][l] != 0 { ans = ans.max(sum); } sum += a[r]; } if dp[l][l] != 0 { ans = ans.max(sum); } } println!("{ans}"); }