1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef vector<int> VI;
typedef long long ll;
typedef pair<int,int> PII;
typedef double db;
const ll mod=1000000007;
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
// head

const ll inf=1ll<<60;
const ll Inf=1ll<<61;
const int N=210;
int n;
ll m,a[N],s[N];
ll dp[210][210][66][2];

ll solve(int l,int r,int w,int z) {
	if (l>r) return 0;
	if (dp[l][r][w][z]!=-Inf) return dp[l][r][w][z];
	if (w==0) return dp[l][r][w][z]=(l!=r?-inf:0);
	ll &ans=dp[l][r][w][z];
	ans=-inf;
	if (z==0) {
		for (int md=l-1;md<=r;md++) {
			ans=max(ans,solve(l,md,w-1,0)+solve(md+1,r,w-1,0)+s[r]-s[md]);
		}
	} else {
		int d=(m>>(w-1))&1;
		if (d==0) {
			ans=solve(l,r,w-1,1);
		} else {
			for (int md=l-1;md<=r;md++) {
				ans=max(ans,solve(l,md,w-1,0)+solve(md+1,r,w-1,1)+s[r]-s[md]);
			}
		}
	}
	return ans;
}
int main() {
	scanf("%d%lld",&n,&m);
	rep(i,1,n+1) scanf("%lld",a+i),s[i]=s[i-1]+a[i];
	rep(i,1,n+1) rep(j,i,n+1) rep(d,0,61) rep(w,0,2)
		dp[i][j][d][w]=-Inf;
	printf("%lld\n",solve(1,n,60,1));
}