#include <bits/stdc++.h>
const int N=2e6+1;
struct Node{
int val;
int l,r;
};
int n,m;
Node tree[N<<2+1];
inline void in(int &x){
x=0;int f=1;
char ch=getchar();
while ((ch<'9'||ch>'0')&&ch!='-')
ch=getchar();
if (ch=='-')
f=-1;
while (ch<='9'&&ch>='0')
x=x*10+ch-'0',ch=getchar();
x*=f;
return;
}
#define lson value<<1
#define rson value<<1|1
inline int min(int a,int b){
return a>b?b:a;
}
inline void Pushup(int value){
tree[value].val=min(tree[lson].val,tree[rson].val);
}
int num[N];
inline void Build(int value,int l,int r){
if (l>r)return;
if (l==r){
tree[value].l=l;tree[value].r=r;
tree[value].val=num[l+r>>1];
return;
}
int mid=l+r>>1;
Build(l,lson,mid);Build(rson,mid+1,r);
tree[value].l=l;tree[value].r=r;
Pushup(value);
}
int L,R;
const int inf=INT_MAX;
inline int Query(int value,int l,int r){
if (l>r)return 0;
if (L<=l&&R>=r)
return tree[value].val;
int mid=l+r>>1;
int mn=inf;
if (L<=mid)
mn=min(mn,Query(l,mid,lson));
if (R>mid)
mn=min(mn,Query(mid+1,r,rson));
return mn;
}
int main(){
in(n);in(m);
for (int i=1;i<=n;i++)
in(num[i]);
Build(1,1,n);
for (int i=1;i<=n;i++){
L=i-m;R=i-1;
if(L<=0)L=1;
if (L>R){
putchar('0');
puts("");
continue;
}
printf("%d\n",Query(1,n,1));
}
}