class Solution {
public int constrainedSubsetSum(int[] nums, int k) {
int n = nums.length;
Deque<Integer> deque = new LinkedList<>();
int ans = Integer.MIN_VALUE;
for(int i = 0; i < n;i++){
while(deque.size()!= 0 && deque.peekFirst() < i-k)
deque.pollFirst();
if(deque.size()!=0)
nums[i] = Math.max(nums[i],nums[i] + nums[deque.peekFirst()]);
ans = Math.max(nums[i],ans);
while(deque.size()>0 && nums[deque.peekLast()] <= nums[i]){
deque.pollLast();
}
deque.add(i);
}
return ans;
}
}