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;
}