//优先队列读入的是id,但是是按照id对应的数排完序的
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int a[1000000];
int aa[1000000];
int bb[1000000];
int n,s;
//这次让我见识到了队列的另外比较高级一点的用法,还可以这样用,第一次见到啊。
struct cmp1
{
bool operator()(const int a1,const int a2)
{
return a[a1]>a[a2];
}
};
struct cmp2
{
bool operator()(const int a1,const int a2)
{
return a[a1]<a[a2];
}
};
//就这里比较高级,比较函数竟然是个结构类型的。
priority_queue<int,vector<int>,cmp1>q1;
priority_queue<int,vector<int>,cmp2>q2;
int main()
{
scanf("%d%d",&n,&s);
int i,cnt1=0,cnt2=0;
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<s;i++)
{
q1.push(i);
q2.push(i);
}
aa[cnt1++]=a[q1.top()];
bb[cnt2++]=a[q2.top()];
for(i=s;i<n;i++)
{
q1.push(i);
q2.push(i);
while(i-q1.top()>=s)
q1.pop();
aa[cnt1++]=a[q1.top()];
while(i-q2.top()>=s)
q2.pop();
bb[cnt2++]=a[q2.top()];
}
printf("%d",aa[0]);
for(i=1;i<n-s+1;i++)
printf(" %d",aa[i]);
printf("/n");
printf("%d",bb[0]);
for(i=1;i<n-s+1;i++)
printf(" %d",bb[i]);
printf("/n");
return 0;
}