#include<iostream>//单调队列
#include<stdio.h>
#include<deque>
using namespace std;
int a[1001000];
int Max[1001000];
int Min[1001000];
int main()
{
int n,k;
while(scanf("%d%d",&n,&k)!=EOF)
{
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
deque<int>que;
while(!que.empty()) que.pop_back();
for(int i=1;i<k;i++)
{
while(!que.empty()&&a[i]>=a[que.back()]) que.pop_back();
que.push_back(i);
}
for(int i=k;i<=n;i++)
{
while(!que.empty()&&a[i]>=a[que.back()]) que.pop_back();
que.push_back(i);
while(!que.empty()&&i-que.front()+1>k) que.pop_front();
Max[i]=a[que.front()];
}
while(!que.empty()) que.pop_back();
for(int i=1;i<k;i++)
{
while(!que.empty()&&a[i]<=a[que.back()]) que.pop_back();
que.push_back(i);
}
for(int i=k;i<=n;i++)
{
while(!que.empty()&&a[i]<=a[que.back()]) que.pop_back();
que.push_back(i);
while(!que.empty()&&i-que.front()+1>k) que.pop_front();
Min[i]=a[que.front()];
}
for(int i=k;i<=n;i++) printf("%d ",Min[i]);cout<<endl;
for(int i=k;i<=n;i++) printf("%d ",Max[i]);cout<<endl;
}
return 0;
}
#include<iostream>//一维rmq
#include<stdio.h>
#include<deque>
#include<cmath>
#include<algorithm>
using namespace std;
int a[1001000];
int Max[1001000];
int Min[1001000];
int dp[1001000];
void init_Max(int n,int k)
{
for(int i=1;i<=n;i++) dp[i]=a[i];
int len=log2(k);
for(int j=1;j<=len;j++)
for(int i=1;i+(1<<j)-1<=n;i++)
dp[i]=max(dp[i],dp[i+(1<<(j-1))]);
for(int i=1;i<=n-k+1;i++) cout<<max(dp[i],dp[i+k-(1<<len)])<<" ";cout<<endl; //printf输出会超时。。
}
void init_Min(int n,int k)
{
for(int i=1;i<=n;i++) dp[i]=a[i];
int len=log2(k);
for(int j=1;j<=len;j++)
for(int i=1;i+(1<<j)-1<=n;i++)
dp[i]=min(dp[i],dp[i+(1<<(j-1))]);
for(int i=1;i<=n-k+1;i++) cout<<min(dp[i],dp[i+k-(1<<len)])<<" ";cout<<endl;
}
int main()
{
int n,k;
while(scanf("%d%d",&n,&k)!=EOF)
{
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
init_Min(n,k);
init_Max(n,k);
}
return 0;
}