Maintain a double ended queue which store the greatest elements to the right in the current window.
window - [4 2 3 1] will have a queue - [4 3 1]
window - [4 3 3 1] will have a queue - [4 3 3 1]
window - [2 4 5 3] will have a queue - [5 3]
The max element of the window will be the first element of the queue.
when we move the window to the right by one element:
- if the max element in the queue is equal to the element removed from the window, then the max element is removed from the queue.
- the new element added to the window is compared to all the elements in the queue from the right and smaller elements are removed.
queue - [4 3 1] and new element is 2 the new queue is [4 3 2]
queue - [4 3 1] and new element is 5 the new queue is 
dq =  // double ended queue n = len(A) // size of the array given ma = -float('inf') for l in range(B): // create the initial double ended queue if A[B-1-l]>=ma: ma = A[B-1-l] dq.append(ma) dq.reverse() a =  a.append(dq) for i in range(B,n): // window is moved one step at a time if A[i-B]==dq: // step 1 from the above explanation dq = dq[1:] p = len(dq) key = -1 for l in range(p): // step 2 from the above explanation if dq[p-l-1]>=A[i]: key = p-l break if key==-1: dq =  else: dq = dq[:key] dq.append(A[i]) // add the new element to the queue a.append(dq) // store the maximum of the current window return a