#include <bits/stdc++.h>   using namespace std;   const long long MOD = (1e9 + 7);   const long long INF = (1e9 + 123456789);   const long long INFL = (INF * INF);   inline long long addm(long long a, long long b, long long m = MOD) {     return ((a + b) % m);   }   inline long long subm(long long a, long long b, long long m = MOD) {     return (((a - b) % m + m) % m);   }   inline long long mulm(long long a, long long b, long long m = MOD) {     return ((a * b) % m);   }   long long powm(long long a, long long b, long long m = MOD) {     long long ret = (!b) ? 1 : powm(a, b / 2, m);     return (!b) ? 1 : mulm(mulm(ret, ret, m), b % 2 ? a : 1, m);   }   long long gcd(long long a, long long b) { return (!b) ? a : gcd(b, a % b); }   long long lcm(long long a, long long b) { return a / gcd(a, b) * b; }   long long inv(long long x, long long m = MOD) { return powm(x, m - 2, m); }   const int N = 1000500;   int a[N], lft[N], nxt[N];   vector<int> nodes, g[N];   struct SegmentTree {     int f, t;     SegmentTree *lc, *rc;     bool has_child, has_lazy = false;     int upd = 0;     int vmax = 0;     SegmentTree(int l, int r) {       if (l == r) {         f = t = l;         lc = rc = NULL;         has_child = false;       } else {         f = l;         t = r;         int mid = (l + r) / 2;         lc = new SegmentTree(l, mid);         rc = new SegmentTree(mid + 1, r);         has_child = true;       }     }     void change(int v) {       vmax += v;       upd += v;       has_lazy = true;     }     void push() {       if (!has_lazy) return;       lc->change(upd);       rc->change(upd);       upd = 0;       has_lazy = false;     }     void update(int l, int r, int x) {       if (r < f || l > t) return;       if (l <= f && t <= r) {         change(x);         return;       }       push();       lc->update(l, r, x);       rc->update(l, r, x);       vmax = max(lc->vmax, rc->vmax);     }     int query(int l, int r) {       if (r < f || l > t) return 0;       if (l <= f && t <= r) return vmax;       return vmax = max(lc->query(l, r), rc->query(l, r));     }   };   void solve() {     int n, k;     cin >> n >> k;     for (int i = 0; i < n; i++) cin >> a[i];     stack<int> st;     for (int i = n - 1; i >= 0; i--) {       while (!st.empty() && a[st.top()] <= a[i]) st.pop();       if (!st.empty())         nxt[i] = st.top();       else         nxt[i] = n;       st.push(i);     }     for (int i = 0; i < n; i++) g[nxt[i]].push_back(i);     function<void(int)> post = [&](int v) {       int l = (int)(nodes).size();       for (int u : g[v]) post(u);       lft[(int)(nodes).size()] = l;       nodes.push_back(v);     };     post(n);     SegmentTree root(0, n);     for (int i = 0; i < k; i++) root.update(lft[i], i, 1);     vector<int> ans;     ans.push_back(root.query(0, n));     for (int i = k; i < n; i++) {       root.update(lft[i - k], i - k, -1);       root.update(lft[i], i, 1);       ans.push_back(root.query(0, n));     }     for (int i = 0; i < (int)(ans).size(); i++) {       if (i) cout <<    ;       cout << ans[i];     }     cout <<   n ;   }   int main(int argc, char *argv[]) {     cin.sync_with_stdio(0);     cin.tie(NULL);     solve();     return 0;   }   