classSolution:defminMaxSubarraySum(self,nums:list[int],k:int)->int:subarrays_max_min_sum=0max_stack:deque[list[int]]=deque([])# Format: [idx, num, shares].subarrays_max_sum=0min_stack:deque[list[int]]=deque([])# Format: [idx, num, shares].subarrays_min_sum=0forend_idx,numinenumerate(nums):start_idx=max(0,end_idx-k+1)# Window start idx slides by 1: must update stacks' info.ifstart_idx>0:max_stack[0][2]-=1# Decrement stack's front num shares.subarrays_max_sum-=max_stack[0][1]ifmax_stack[0][0]<start_idx:# Front num out of window.max_stack.popleft()min_stack[0][2]-=1# Decrement stack's front num shares.subarrays_min_sum-=min_stack[0][1]ifmin_stack[0][0]<start_idx:# Front num out of window.min_stack.popleft()max_shares=1# Base case.subarrays_max_sum+=numwhilemax_stackandmax_stack[-1][1]<=num:_,prev_num,prev_shares=max_stack.pop()max_shares+=prev_shares# Max shares transition.# Reflect transition in max sum.subarrays_max_sum+=(num-prev_num)*prev_sharesmax_stack.append([end_idx,num,max_shares])min_shares=1# Base case.subarrays_min_sum+=numwhilemin_stackandmin_stack[-1][1]>=num:_,prev_num,prev_shares=min_stack.pop()min_shares+=prev_shares# Min shares transition.# Reflect transition in min sum.subarrays_min_sum+=(num-prev_num)*prev_sharesmin_stack.append([end_idx,num,min_shares])subarrays_max_min_sum+=subarrays_max_sum+subarrays_min_sumreturnsubarrays_max_min_sum
classSolution{public:longlongminMaxSubarraySum(vector<int>&nums,intk){longlongtotalMaxMinSum=0;longlongwindowMaxSum=0,windowMinSum=0;// Format: {idx, num, shares}. Use long long to prevent overflow.deque<tuple<int,int,longlong>>maxStack,minStack;for(intendIdx=0;endIdx<nums.size();endIdx++){intstartIdx=max(0,endIdx-k+1);// Window start idx slides by 1: must update stacks' info.if(startIdx>0){get<2>(maxStack.front())--;// Decrement stack's front num shares.windowMaxSum-=get<1>(maxStack.front());// Front num out of window.if(get<0>(maxStack.front())<startIdx)maxStack.pop_front();get<2>(minStack.front())--;// Decrement stack's front num shares.windowMinSum-=get<1>(minStack.front());// Front num out of window.if(get<0>(minStack.front())<startIdx)minStack.pop_front();}longlongnum=nums[endIdx];longlongmaxShares=1;// Base case.windowMaxSum+=num;while(!maxStack.empty()&&get<1>(maxStack.back())<=num){intprevNum=get<1>(maxStack.back());longlongprevShares=get<2>(maxStack.back());maxStack.pop_back();maxShares+=prevShares;// Max shares transition.// Reflect transition in max sum.windowMaxSum+=(num-prevNum)*prevShares;}maxStack.push_back({endIdx,num,maxShares});longlongminShares=1;// Base case.windowMinSum+=num;while(!minStack.empty()&&get<1>(minStack.back())>=num){intprevNum=get<1>(minStack.back());longlongprevShares=get<2>(minStack.back());minStack.pop_back();minShares+=prevShares;// Min shares transition.// Reflect transition in min sum.windowMinSum+=(num-prevNum)*prevShares;}minStack.push_back({endIdx,num,minShares});totalMaxMinSum+=windowMaxSum+windowMinSum;}returntotalMaxMinSum;}};