#include<unordered_map>
#include<algorithm>
#include<stdlib.h>
#include<iostream>
#include<iomanip>
#include<utility>
#include<random>
#include<vector>
#include<cmath>
#include<array>
#include<queue>
#include<stack>
#include<map>
#include<set>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pa;
const ll N = 1e7 + 10, INF = 0x7fffffffffffffff, MOD = 1e9 + 7;
ll t;
ll n, k, con[N][2], ori[N];
bool cmp(int x, int y) {
if (ori[x] != ori[y])return ori[x] > ori[y];
else return x < y;
}
void push_up(int ind) {
int tmp[4] = { con[ind * 2][0],con[ind * 2][1],con[ind * 2 + 1][0], con[ind * 2 + 1][1] };
sort(tmp, tmp + 4, cmp);
ll res = 0;
con[ind][0] = tmp[0];
for (int i = 1; i < 4; i++)if (ori[tmp[i]] != ori[tmp[0]])res = tmp[i];
con[ind][1] = res;
}
void build(int l, int r, int ind) {
if (l == r) {
con[ind][0] = l;
con[ind][1] = 0;
return;
}
ll mid = l + r >> 1;
build(l, mid, ind * 2);
build(mid + 1, r, ind * 2 + 1);
push_up(ind);
}
void udp(int l, int r, int ind, int tmpl, int tmpr, int val) {
if (l >= tmpl && r <= tmpr) {
con[ind][0] = val;
return;
}
ll mid = l + r >> 1;
if (mid >= tmpl)udp(l, mid, ind * 2, tmpl, tmpr, val);
if (mid + 1 <= tmpr)udp(mid + 1, r, ind * 2 + 1, tmpl, tmpr, val);
push_up(ind);
}
pa query(int l, int r, int ind, int tmpl, int tmpr) {
if (l >= tmpl && r <= tmpr) {
return { con[ind][0], con[ind][1] };
}
ll mid = l + r >> 1;
pa tmp, tmpp;
if (mid >= tmpl)tmp = query(l, mid, ind * 2, tmpl, tmpr);
if (mid + 1 <= tmpr)tmpp = query(mid + 1, r, ind * 2 + 1, tmpl, tmpr);
int res[4] = { tmp.first,tmp.second,tmpp.first, tmpp.second };
sort(res, res + 4, cmp);
for (int i = 1; i < 4; i++) {
if (ori[res[i]] != ori[res[0]]) {
return { res[0],res[i] };
}
}
return { res[0],0 };
}
ll querym(int l, int r, int ind, int tmpl, int tmpr) {
if (l >= tmpl && r <= tmpr) {
return con[ind][0];
}
ll mid = l + r >> 1;
ll tmp = 0, tmpp = 0;
if (mid >= tmpl)tmp = querym(l, mid, ind * 2, tmpl, tmpr);
if (mid + 1 <= tmpr)tmpp = querym(mid + 1, r, ind * 2 + 1, tmpl, tmpr);
if (cmp(tmp, tmpp))return tmp;
else return tmpp;
}
void solve() {
ori[0] = -1;
deque<ll> ans;
cin >> n >> k;
for (int i = 1; i <= n; i++)cin >> ori[i];
build(1, n, 1);
for (int i = 1; i <= n; i++) {
ll res = 0;
res = querym(1, n, 1, i, i + k);
if (ans.size() && ori[res] == ans.back() && ori[res] != -1)res = query(1, n, 1, i, i + k).second;
if (res)k -= res - i;
ans.push_back(ori[res]);
if (res)udp(1, n, 1, res, res, 0);
}
for (ll i : ans)cout << i << " ";
cout << '\n';
}
int main() {
t = 1;
while (t--) {
solve();
}
return 0;
}