#include <deque>
#include <iostream>
#include <vector>
using namespace std;

vector<int> max_slip_window(vector<int>& nums, int k)
{   
    int n = nums.size();
    //双端队列里维持严格从大到小排列的数字的下标
    //如果即将进队列的元素比较大,就一直从尾部弹出,保证队列里都是严格“大压小”
    //这样队首指针一直指向的就是窗口内的最大值
    //如果l指针指向的是窗口内最值,就从“队首”弹出。
    //然后l++,r++,直到r来到最后一个元素,收集完最值,结束。
    deque<int> dq;
    for (int i = 0; i<k-1; ++i)
    {
        
        while (!dq.empty() && nums[dq.back()] <= nums[i])
        {
            dq.pop_back();
        }
        dq.push_back(i);
    }

    //此时窗口大小是k-1个元素
    //每次r进窗口,收集窗口内最值
    vector<int> ans;
    for (int l = 0, r = k-1; r < n; ++r)
    {
        while (!dq.empty() && nums[dq.back()] <= nums[r])
        {
            dq.pop_back();
        }
        dq.push_back(r);
        ans.push_back(nums[dq.front()]);

        if (l++ == dq.front())
        {
            dq.pop_front();
        }
    }

    return ans;

}


int main() {
    int n,k;
    cin >> n >> k;
    vector<int> nums(n);
    for (auto& num : nums)
    {
        cin >> num;
    }

    vector<int> ans = max_slip_window(nums, k);
    for (auto& n : ans)
    {
        cout << n << " ";
    }
}
// 64 位输出请用 printf("%lld")