#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N=2e6+5;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n, k;
cin >> n >> k;
vector<ll> a(n);//不开long long 见祖宗
for (int i = 0; i < n; ++i) {
cin >> a[i];
}
// 存储每个窗口的最小值
vector<ll> minresult;
// 存储每个窗口的最大值
vector<ll> maxresult;
deque<int> mindeque; // 维护单调递增队列,队首为当前窗口最小值的索引
deque<int> maxdeque; // 维护单调递减队列,队首为当前窗口最大值的索引
for (int i = 0; i < n; ++i) {
// 维护最小值队列
// 移除所有大于当前元素的元素,保持队列递增
while (!mindeque.empty() && a[i] <= a[mindeque.back()]) {
mindeque.pop_back();
}
mindeque.push_back(i);
// 移除超出窗口范围的元素
while (mindeque.front() <= i - k) {
mindeque.pop_front();
}
// 维护最大值队列
// 移除所有小于当前元素的元素,保持队列递减
while (!maxdeque.empty() && a[i] >= a[maxdeque.back()]) {
maxdeque.pop_back();
}
maxdeque.push_back(i);
// 移除超出窗口范围的元素
while (maxdeque.front() <= i - k) {
maxdeque.pop_front();
}
// 当窗口大小达到k时,开始记录结果
if (i >= k - 1) {
minresult.push_back(a[mindeque.front()]);
maxresult.push_back(a[maxdeque.front()]);
}
}
// 输出最小值结果
for (int i = 0; i < minresult.size(); ++i) {
if (i > 0) cout << " ";
cout << minresult[i];
}
cout << "\n";
// 输出最大值结果
for (int i = 0; i < maxresult.size(); ++