#include<stdio.h>
int a[1000009];//存数
int q[1000009];//窗口形成的栈,存a[]的下标,a[q[]]为窗口中的单调数列
int tt=-1, hh=0;//栈尾,栈顶//∵下面栈存新数时,先++t,为保证tt从0开始,∴tt=-1
int main()
{
int n, k,i;
scanf("%d %d", &n, &k);
for (i = 0; i < n; i++)
{
scanf("%d", &a[i]);
//找最小
//a[q[]]是单调递增序列,a[q[hh]]最小
if (q[hh] < i - k + 1)hh++;//如果q[hh]出窗口,则hh++
while (hh <= tt &&a[q[tt]] >= a[i])tt--;
//如果新数比栈尾小,即a[i]<a[q[tt]],
//∵i>q[tt],所以下标是q[tt]的数会先被弹出栈
//即如果有a[i]在,最小值不可能为a[q[tt]],故删除q[tt]
q[++tt] = i;//栈存新数
if(i+1>=k)printf("%d ", a[q[hh]]);
//初始状态已经取到k个,∴遍历前k个数时不输出(i从0开始)
}
printf("\n");
//找最大
//a[q[]]是单调递减序列,a[q[hh]]最大
hh = 0;//注意!需还原
tt = -1;
for (i = 0; i < n; i++)
{
if (q[hh] < i - k + 1)hh++;
while (hh <= tt && a[q[tt]] <= a[i])tt--;//与求最小对称,只有这里不一样
q[++tt] = i;
if (i + 1 >= k)printf("%d ", a[q[hh]]);
}
return 0;
}