import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt();
int[] a = new int[n + 1]; // 1-based数组
for (int i = 1; i <= n; i++) {
a[i] = sc.nextInt();
}
// 处理最小值队列
Deque<Integer> minDeque = new ArrayDeque<>();
List<Integer> minRes = new ArrayList<>();
for (int i = 1; i <= n; i++) {
// 移除超出窗口的队头元素
//通过这一个while循环,可以保证加入最小序号队列minQueue的序号始终是在窗口内的
while (!minDeque.isEmpty() && minDeque.peekFirst() <= i - k) {
minDeque.pollFirst();
}
// 维护队列递增,移除比当前大的队尾元素,通过这种事先比较,使minQueue里面队尾的序号所对应的值只小不大
//为什么不是队首,因为队首到目前为止可以加进去,已经证明它是最小的了,能让它滚出去只能是不在要求序号范围内
while (!minDeque.isEmpty() && a[minDeque.peekLast()] >= a[i]) {
minDeque.pollLast();
}
//为什么要将每一个i都加入,是为了确保每一个i都经历比较
minDeque.addLast(i);
if (i >= k) {
//经历比较后,minQueue里面的首部序号一定是最小的,为什么要经历一个判断之后再加入:
//是因为第一组的时候,i小于k,此时,并没有比较完(第一组)
minRes.add(a[minDeque.peekFirst()]);
}
}
//
// 处理最大值队列
Deque<Integer> maxDeque = new ArrayDeque<>();
List<Integer> maxRes = new ArrayList<>();
for (int i = 1; i <= n; i++) {
// 移除超出窗口的队头元素
while (!maxDeque.isEmpty() && maxDeque.peekFirst() <= i - k) {
maxDeque.pollFirst();
}
// 维护队列递减,移除比当前小的队尾元素
while (!maxDeque.isEmpty() && a[maxDeque.peekLast()] <= a[i]) {
maxDeque.pollLast();
}
maxDeque.addLast(i);
if (i >= k) {
maxRes.add(a[maxDeque.peekFirst()]);
}
}
// 输出结果
for (int num : minRes) System.out.print(num + " ");
System.out.println();
for (int num : maxRes) System.out.print(num + " ");
System.out.println();
}
}