// #pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
using namespace std;
#define int long long
// #define mkp make_pair
#define txt freopen("kout.in", "r", stdin), freopen("kout.out", "w", stdout);
const int N = 2000, K = 20;
const int mod = 998244353;
void solve()
{
int n, k;
cin >> n >> k;
int mn = 1e9;
vector<int> arr;
vector<int> vec(n);
for(auto &i : vec)
{
cin >> i;
arr.push_back(i);
mn = min(mn, i);
}
while(mn < 30)
{
vector<int> add;
double cnt = 0;
for(int i = 0; i <= vec.size(); i++)
{
if(i == vec.size() || vec[i] > mn)
{
if((int) cnt % 2)
add.push_back(i);
cnt = 0;
}
else
cnt = cnt + 1.0 / pow(2, mn - vec[i]);
}
reverse(add.begin(), add.end());
vector<int> v2;
for(int i = 0; i <= vec.size(); i++)
{
if(!add.empty() && add.back() == i)
{
v2.push_back(mn);
add.pop_back();
}
if(i < vec.size())
v2.push_back(vec[i]);
}
vec = v2;
mn++;
}
if(vec.size() > n + k)
assert(0);
// for(auto i : vec)
// cout << i << ' ';
// return;
int len = n + k - vec.size();
vector<int> res;
int ind = 0;
for(auto i : vec)
{
if(!len || (ind < arr.size() && arr[ind] == i))
{
res.push_back(i);
ind++;
}
else
{
if(len >= pow(2, i) - 1)
{
len = len - pow(2, i) + 1;
for(int j = pow(2, i); j--;)
res.push_back(0);
}
else
{
len++;
vector<int> v = {i};
for(int j = 0; j <= i; j++)
{
if(pow(2, i - j) <= len)
{
v.clear();
for(int k = pow(2, i - j); k--;)
v.push_back(j);
len -= pow(2, i - j);
break;
}
}
for(auto j : v)
{
if(!len)
res.push_back(j);
else
{
len--;
res.push_back(j - 1);
res.push_back(j - 1);
}
}
len = 0;
}
}
}
for(auto i : res)
cout << i << ' ';
cout << '\n';
}
signed main()
{
ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int T = 1;
for (; T--; solve());
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |