use proconio::input; fn main() { input! { n: usize, k: u32, a: [u64; n], c: [u32; n], } let mut dp = vec![vec![0; n]; n]; for (i, &c) in c.iter().enumerate() { dp[(i + 1) % n][i] = 1 << c; } for d in 2..=n { for l in 0..n { let r = l + d; for c in l + 1..r { let c = c % n; let r = r % n; let x = dp[c][l]; let y = dp[r][c]; let z = x & (y | y << k | y >> k) | y & (x | x << k | x >> k); dp[r][l] |= z; } } } 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]; } } println!("{ans}"); }