//单调队列
//队列元素递增或递减 元素最多进队出队各一次
//应用:复杂度为o(n^2)的动态规划 可求最大最小值
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
int n,m,a[1000001];
struct uio{
int minum,micnt;
}mi[1000001];
struct oiu{
int manum,macnt;
}ma[1000001];
void getmin()
{
int h=1,t=0;
for(int i=1;i<m;i++)//前(m-1)个先入队
{
while(h<=t&&mi[t].minum>=a[i])
t--;
mi[++t].minum=a[i];
mi[t].micnt=i;
}
for(int i=m;i<=n;i++)
{
while(h<=t&&mi[t].minum>=a[i])
t--;
mi[++t].minum=a[i];
mi[t].micnt=i;
while(mi[h].micnt<i-m+1)
h++;
cout<<mi[h].minum<<" ";
}
cout<<endl;
}
void getmax()
{
int h=1,t=0;
for(int i=1;i<m;i++)//前(m-1)个先入队
{
while(h<=t&&ma[t].manum<=a[i])
t--;
ma[++t].manum=a[i];
ma[t].macnt=i;
}
for(int i=m;i<=n;i++)
{
while(h<=t&&ma[t].manum<=a[i])
t--;
ma[++t].manum=a[i];
ma[t].macnt=i;
while(ma[h].macnt<i-m+1)
h++;
cout<<ma[h].manum<<" ";
}
cout<<endl;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
getmin();
getmax();
return 0;
}