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) & widen(x, k) & widen(y, 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}"); } fn widen(mut x: u64, k: u32) -> u64 { match k { 0 => x, 1 => x | x << 1 | x >> 1, 2 => { x <<= 1; x <<= 2; x <<= 2; x >> 2 } 3 => { x <<= 1; x <<= 2; x <<= 4; x >> 3 } 4 => { x <<= 1; x <<= 2; x <<= 4; x <<= 2; x >> 4 } 5 => { x <<= 1; x <<= 2; x <<= 4; x <<= 4; x >> 4 } _ => unreachable!(), } }