For some array c, let's denote a greedy subsequence as a sequence of indices p_1, p_2, ..., p_l such that 1 ≤ p_1 < p_2 < ... < p_l ≤ |c|, and for each i ∈ [1, l - 1], p_{i + 1} is the minimum number such that p_{i + 1} > p_i and c[p_{i + 1}] > c[p_i].

You are given an array a_1, a_2, ..., a_n. For each its subsegment of length k, calculate the length of its longest greedy subsequence.

Input

The first line contains two integers n and k (1 ≤ k ≤ n ≤ 10^6) — the length of array a and the length of subsegments.

The second line contains n integers a_1, a_2, ..., a_n (1 ≤ a_i ≤ n) — array a.

Output

Print n - k + 1 integers — the maximum lengths of greedy subsequences of each subsegment having length k. The first number should correspond to subsegment a[1..k], the second — to subsegment a[2..k + 1], and so on.

Examples

Input


6 4
1 5 2 5 3 6


Output


2 2 3 


Input


7 6
4 5 2 5 3 6 6


Output


3 3 

Note

In the first example: 

  * [1, 5, 2, 5] — the longest greedy subsequences are 1, 2 ([c_1, c_2] = [1, 5]) or 3, 4 ([c_3, c_4] = [2, 5]). 
  * [5, 2, 5, 3] — the sequence is 2, 3 ([c_2, c_3] = [2, 5]). 
  * [2, 5, 3, 6] — the sequence is 1, 2, 4 ([c_1, c_2, c_4] = [2, 5, 6]). 



In the second example: 

  * [4, 5, 2, 5, 3, 6] — the longest greedy subsequences are 1, 2, 6 ([c_1, c_2, c_6] = [4, 5, 6]) or 3, 4, 6 ([c_3, c_4, c_6] = [2, 5, 6]). 
  * [5, 2, 5, 3, 6, 6] — the subsequence is 2, 3, 5 ([c_2, c_3, c_5] = [2, 5, 6]). 
#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int x = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  return x * f;
}
int n, k;
int a[2000000];
int head[2000000], pos;
struct edge {
  int to, next;
} e[2000000 << 1];
void add(int a, int b) {
  pos++;
  e[pos].to = b, e[pos].next = head[a], head[a] = pos;
}
void insert(int a, int b) {
  add(a, b);
  add(b, a);
}
int in[2000000], out[2000000], T = -1;
bool p[2000000];
void dfs(int u, int fa) {
  in[u] = ++T;
  for (int i = head[u]; i; i = e[i].next) {
    int v = e[i].to;
    if (v == fa) continue;
    dfs(v, u);
  }
  out[u] = T;
}
struct seg {
  struct edge {
    int l, r, mx, tag;
  } e[2000000 << 1];
  void pushup(int u) { e[u].mx = max(e[u << 1].mx, e[u << 1 | 1].mx); }
  void pushdown(int u) {
    if (e[u].tag) {
      e[u << 1].tag += e[u].tag, e[u << 1 | 1].tag += e[u].tag;
      e[u << 1].mx += e[u].tag, e[u << 1 | 1].mx += e[u].tag;
      e[u].tag = 0;
    }
  }
  void build(int u, int l, int r) {
    e[u].l = l, e[u].r = r;
    int mid = (l + r) >> 1;
    if (l == r) {
      e[u].mx = 0;
      return;
    }
    build(u << 1, l, mid);
    build(u << 1 | 1, mid + 1, r);
    pushup(u);
  }
  void add(int u, int x, int y, int c) {
    int l = e[u].l, r = e[u].r, mid = (l + r) >> 1;
    if (l != r) pushdown(u);
    if (x <= l && y >= r) {
      e[u].mx += c, e[u].tag += c;
      return;
    }
    if (y <= mid)
      add(u << 1, x, y, c);
    else if (x > mid)
      add(u << 1 | 1, x, y, c);
    else
      add(u << 1, x, mid, c), add(u << 1 | 1, mid + 1, y, c);
    pushup(u);
  }
  int ask() { return e[1].mx; }
} seg;
int st[2000000], top;
int main() {
  n = read(), k = read();
  for (int i = 1; i <= n; i++) a[i] = read();
  st[++top] = n;
  for (int i = n - 1; i; i--) {
    int ret = -1;
    while (top && a[i] >= a[st[top]]) top--;
    if (top) ret = st[top];
    st[++top] = i;
    if (ret != -1) insert(i, ret), p[i] = 1;
  }
  for (int i = 1; i <= n; i++)
    if (!p[i]) insert(0, i);
  dfs(0, 0);
  seg.build(1, 1, n);
  for (int i = 1; i < k; i++) seg.add(1, in[i], out[i], 1);
  for (int i = 0; i <= n - k; i++) {
    seg.add(1, in[i + k], out[i + k], 1);
    printf("%d ", seg.ask());
    seg.add(1, in[i + 1], out[i + 1], -1);
  }
  puts("");
}
