/查询区间的最值,就用了线段树/
#include<iostream>
#include<string.h>
#include<algorithm>
#include<cstdio>
using namespace std;
#define clean(a,b) memset(a,b,sizeof(a))
#define maxn 1000005
#define inf 0x3f3f3f3f
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
int treemax[maxn<<2],treemin[maxn<<2]; //保存区间最大值和区间最小值
int maxx[maxn],minn[maxn];
int n,k;
void push_up(int rt)
{
treemax[rt] = max(treemax[rt<<1],treemax[rt<<1|1]);
treemin[rt] = min(treemin[rt<<1],treemin[rt<<1|1]);
return ;
}
void build(int l,int r,int rt)
{
if(l==r)
{
scanf("%d",&treemax[rt]);
treemin[rt] = treemax[rt];
return ;
}
int mid=(l+r) >> 1;
build(lson);
build(rson);
push_up(rt);
}
int querymax(int l,int r,int rt,int tl,int tr) //查询tl~tr区间的最大值
{
if(r < tl || l > tr)
return -inf; //找最大值的时候不在这个区间的要返回-inf,这样找的数一定在给定的数组中
if(l>=tl && r<=tr)
return treemax[rt];
int mid=(l+r) >> 1;
int left=querymax(lson,tl,tr);
int right=querymax(rson,tl,tr);
return max(right,left);
}
int querymin(int l,int r,int rt,int tl,int tr) //查询tl~tr区间的最小值
{
if(r < tl || l > tr)
return inf; //同上
if(l>=tl && r<=tr)
return treemin[rt];
int mid=(l+r) >> 1;
int left=querymin(lson,tl,tr);
int right=querymin(rson,tl,tr);
return min(right,left);
}
int main()
{
int cnt=0;
scanf("%d%d",&n,&k);
build(1,n,1); //建树
for(int i=1;i<=n-k+1;i++)
{
maxx[++cnt]=querymax(1,n,1,i,i+k-1);
minn[cnt]=querymin(1,n,1,i,i+k-1);
}
for(int i=1;i<=cnt;i++)
printf("%d ",minn[i]);
printf("\n");
for(int i=1;i<=cnt;i++)
printf("%d ",maxx[i]);
return 0;
}