### o079. 4. 最佳選擇
###### 2024年6月
###### Python
```python=
def search_max(maxright,nums,maxnum):
if maxnum<=0 or len(nums)==0 or psum[nums[0]]>maxnum or maxright==0:return -1
left,right=0,len(nums)-1
while left<=right:
mid=(left+right)//2
if nums[mid]<maxright and psum[nums[mid]]<=maxnum:left=mid+1
else:right=mid-1
if right==-1:return -1
return nums[right]
def check():
ans=0
temp=search_max(n,left[0],k)
if temp>=0:ans=psum[temp]
for item in right:
if 0-item in left:
for r in right[item]:
temp=search_max(r,left[0-item],k-ssum[r])
if temp>=0:
total=psum[temp]+ssum[r]
ans=max(ans,total)
return ans
from itertools import accumulate
from collections import defaultdict
import bisect
n,k=map(int,input().split())
nums=list(map(int,input().split()))
psum=list(accumulate(nums))
ssum=list(accumulate(nums[-1::-1]))[-1::-1]
odd_even=list(map(lambda x:2*(x%2)-1,nums))
left =list(accumulate(odd_even))
right=list(accumulate(odd_even[-1::-1]))[-1::-1]
temp=defaultdict(list)
for index,item in enumerate(left):bisect.insort(temp[item],index)
left=temp
temp=defaultdict(list)
for index,item in enumerate(right):bisect.insort(temp[item],index)
right=temp
print(check())
```