CSES - Shared codeLink to this code: https://cses.fi/paste/74a4cacc983d5b61635f1c/
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using ll = long long int;
using ull = unsigned long long int;
using namespace std;
using namespace __gnu_pbds;
template <typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
const ll maximum = 1e9 + 7;

void solve()
{
    ll num, siz;
    cin >> num >> siz;

    vector<ll> vec(num);
    multiset<ll> small; // small is actually maxheap
    multiset<ll> large; // large is a minheap
    for (ll i = 0; i < num; i++)
    {
        cin >> vec[i];
        small.insert((-1) * vec[i]);

        // every num in large >= every num in small
        if (!small.empty() && large.empty() || *(small.begin()) * (-1) > *(large.begin()))
        {
            ll val = *(small.begin()) * (-1);
            small.erase(small.find(val * (-1)));
            // small.erase(small.begin());
            large.insert(val);
        }
        // checking uneven size
        if (small.size() > large.size() + 1)
        {
            ll val = *(small.begin()) * (-1);
            small.erase(small.find((val) * (-1)));
            // small.erase(small.begin());
            large.insert(val);
        }
        if (large.size() > small.size() + 1)
        {
            ll val = *(large.begin());
            large.erase(large.find(val));
            small.insert(val * (-1));
        }

        // for(auto it:small)cout<<it<<" n";
        // cout<<endl;
        // for(auto it:large)cout<<it<<" ";

        // find median
        if (siz == 2 && i >= 1)
        {
            cout << min(vec[i], vec[i - 1]) << " ";
        }
        else if (i + 1 >= siz)
        {
            if (siz & 1)
            {
                if (large.size() > small.size())
                {
                    cout << *(large.begin()) << " ";
                }
                else
                    cout << *(small.begin()) * (-1) << " ";
            }
            else
            {
                ll val1 = *(large.begin());
                ll val2 = *(small.begin()) * (-1);
                if (val1 == 0)
                    cout << val2 << " ";
                else if (val2 == 0)
                    cout << val1 << " ";
                else
                    cout << min(val1, val2) << " ";
            }
            // removing the first element

            if (small.count(vec[i + 1 - siz] * (-1)))
                small.erase(vec[i + 1 - siz] * (-1));
            else
                large.erase(vec[i + 1 - siz]);
        }
    }
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    ll n;
    n = 1;
    // cin >> n;
    for (ll i = 1; i <= n; i++)
    {
        // cout << "Case " << i << ": ";
        solve();
    }
    return 0;
}