package pro.算法定向练习.数据结构;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Stack_1750 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken()); // 数组的长度
int c = Integer.parseInt(st.nextToken()); // 栈的长度
int[] data = new int[n]; // 数组
int[] stack = new int[c]; // 栈
// idx 栈的索引, count 输出序列个数, 当前数组走到 pos数组的位置
int idx = -1, count = 0, pos = 0;
int[] ans = new int[n]; // 输出序列
st = new StringTokenizer(br.readLine()); // 读数组
for (int i = 0; i < n; i++) {
data[i] = Integer.parseInt(st.nextToken());
}
while (count < n) {// 没有输出完
if(idx < 0) { // 栈里面是空的情况
int start = pos; // 从当前位置开始
int end = pos + c > n ? n : pos + c; // 栈长度为结束位置
for (int i = start; i < end; i++) {
if(data[i] < data[pos]) { // 寻找最小的数的索引 赋予给 pos
pos = i;
}
}
while (start <= pos) {// 从开始位置到最小的数逐步入栈
stack[++idx] = data[start++];
}
ans[count++] = stack[idx--]; // 出栈顶的数据
pos++; // 当前元素已经出栈,下次开始的位置从pos+1开始
} else { // 栈里面不为空的时候
int top = stack[idx]; // 记录栈顶元素
int start = pos; // 寻找最小数的开始位置
// 寻找最小数的结束位置,因为栈元素索引是0开始 所以多减1
int end = pos + c - idx - 1 > n ? n : pos + c - idx - 1;
// 寻找最小数是否比栈顶元素小
boolean f = false;
for (int i = start; i < end; i++) {
// 寻找最小数和栈顶进行比较
if(data[i] < top && !f) {
pos = i;
f = true;
}
// 寻找最小数和数据后面数据进行对比
else if(f == true && data[i] < data[pos]) {
pos = i;// 记录找到最小数据的pos位置
}
}
// 找到最小数的位置进行逐一入栈
while (start <= pos && f) {
stack[++idx] = data[start++];
}
// 找到最小数的位置不是栈顶就需要将位置往后移一,下次需要从+1位置开始
if(stack[idx] != top)pos++;
// 出栈
ans[count++] = stack[idx--];
}
}
for (int i = 0; i < n; i++) {
System.out.print(ans[i]);
if(i!=n-1)System.out.print(" ");
}
}
}