


An array ‘B’ is a subarray of an array ‘A’ if ‘B’ that can be obtained by deletion of, several elements(possibly none) from the start of ‘A’ and several elements(possibly none) from the end of ‘A’.
The first line contains a single integer ‘T’ denoting the number of test cases. The 'T' test cases follow.
The first line of each test case contains two integers separated by single space ‘N’ and ‘K’ denoting the number of elements in the array/list and the length of the subarray.
The second line of each test case contains ‘N’ single space-separated integers denoting the elements of the array/list.
For each test case, print a single line that contains ‘N’ - ‘K’ + 1 space-separated integers denoting the maximum for each subarray in the following sequence:
[0, K-1], [1, K], . . . , [N-K, N-1] where [i, j] denotes the maximum element in the subarray starting from the ith index and ending with jth index.
You do not need to print anything, it has already been taken care of. Just implement the given function.
1 <= 'T' <= 50
1 <= 'N' <= 10^4
1 <= 'K' <= 'N'
0 <= 'ARR[i]' <= 10^5
Where 'ARR[i]' denotes the ith elements of the given array/list.
Time Limit: 1 sec
The basic idea of this approach is to iterate through all the possible subarrays of length K and then find the maximum of each subarray.
Let’s assume a window of size K denoting a subarray. Now we can slide this window to get every possible subarray of the given array. Next, our task would be to find the maximum number in the window.
Consider the steps as follows :
The basic idea of this approach is to use an efficient data structure for querying the maximum element in the window.
We can use an ordered_map in C++ (TreeMap in java and dictionary in Python) to perform this task.
Consider the following figure to see what happens when we move the window described in Approach1.
We can observe that when we slide our window, which is currently denoting a subarray [0, 2], two things happen :
Now, we just want to get the maximum element in our updated window. The above task can easily be done using the ordered_map efficiently. Therefore we will use an ordered_map for storing the elements of the window. Since insertion, the deletion and query for the maximum element can be done in O(logN) time in the ordered_map. This approach would be more efficient than the previous one. Consider the steps as follows :
The basic idea of this approach is to use a deque to store the elements of the window. We will maintain a deque that will store elements in non-increasing order such that the maximum element of the window is at the front of the deque. We will store the index of the element.
Now consider the explanation in the following image for a better understanding of the working of the deque.
Consider the steps as follows :