#include "perm.h"
#include <bits/stdc++.h>
#define int long long
#define emb emplace_back
#define pii pair <int32_t, int32_t>
#define tiii tuple <int32_t, int32_t, int32_t>
#define all(a) a.begin(), a.end()
using namespace std;
const int N = 1e5 + 5;
const int inf = 1e18;
vector<int32_t> construct_permutation(long long k){
// return {4, 0, 3, 1, 2};
vector <int> val(65);
int mul = 1;
for (int i = 0; i <= 60; i++) {
val[i] = mul;
mul *= 2;
}
vector <int> need;
for (int i = 60; i >= 0; i--) {
while (k >= val[i]) {
// cout << "UPDATE : " << k << "\n";
k -= val[i], need.emb(i);
}
}
vector <int32_t> ans;
int x = 1;
// cout << "NEED : ";
// for (auto e : need) cout << e << " ";
// cout << "\n";
while (x <= need[0]) ans.emb(x++);
while (ans.size() <= 300) ans.emb(-1);
for (int i = 1; i < need.size(); i++) {
auto e = need[i];
// cout << e << " : ";
bool change = 0;
for (int j = 299; j >= 0; j--) {
if (ans[j] == e) {
ans[j + 1] = x++;
change = 1;
// cout << j;
break;
}
else ans[j + 1] = ans[j];
}
if (!change) ans[0] = x++;
// cout << "\n";
}
vector <int32_t> realans;
for (auto e : ans) {
if (e == -1) break;
realans.emb(e - 1);
}
// cout << "ANS : ";
// for (auto e : realans) cout << e << " "; cout << "\n";
return realans;
}
/*
1: {}
2: {1}
3: {1, 0}
4: {0, 1}
5: 2^2 + 2^0 : {2, 0, 1}
6: 5: find xi such that sum(2^xi - 1) = 5 -> 2^2-1 + 2^1-1 + 2^1-1 = {2, 3, 1, 0}
4 0 3 1 2
*/