//移动窗口,在一串数字中,窗口从左向右移动,每移动一步,输出窗口的min/max。
#include<iostream>
using namespace std;
const int N=10010;
int a[N],q[N];//q[hh]用于存储加入队列的数下标对应的i值,a[N]存的是值
int hh=0,tt=-1;
//hh->tt,存入的单调窗口
//q[N],每个数都加进去的普通窗口
//a[N],数值
int main()
{
int n,k;
cin>>n>>k;
for(int i=0;i<n;i++)cin>>a[i];
for(int i=0;i<n;i++)
{
if(i-k+1>q[hh])hh++;//超出窗口个数,弹出
while(a[q[tt]]>=a[i]&&hh<=tt)tt--;//保证a[q[tt]]单调,将大的数弹出窗扣。q[tt]还在队列中;
q[++tt]=i;//将下标加入窗口,保证单调
//这个a[i]可能是最小值,故应该先插入队列,再输出
if(i>=k-1)cout<<a[q[hh]]<<' ';
}
cout<<endl;
hh=0,tt=-1;
for(int i=0;i<n;i++)
{
if(i-k+1>q[hh])hh++;//超出窗口个数,弹出
while(a[q[tt]]<=a[i]&&hh<=tt)tt--;//保证a[q[tt]]单调,将小的数弹出窗扣。q[tt]还在队列中;
q[++tt]=i;//将下标加入窗口,保证单调
if(i>=k-1)cout<<a[q[hh]]<<' ';
}
return 0;
}