#include <bits/stdc++.h>
#include "Alice.h"
using namespace std;
using ll = long long;
using vint = vector<int>;
using vll = vector<ll>;
using pint = pair<int, int>;
using vpint = vector<pint>;
#define fi first
#define se second
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()
#define rep(i, n) for (int i = 0; i < (n); i++)
#define rrep(i, n) for (int i = (n)-1; i >= 0; i--)
#define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define RFOR(i, a, b) for (int i = (a)-1; i >= (b); i--)
const int BITS = 60000;
const int VBITS = 60;
const int n = 5000;
const int seed = 18342;
vpint Alice(){
mt19937_64 rng(seed);
ll x = setN(n);
bitset<BITS> b, bv(x);
rep(i, BITS/VBITS) {
b |= bv << i*VBITS;
}
vint p(n, -1);
int b_count = 0;
rrep(i, n) {
if (i == 0) continue;
int b_size = __lg(i);
int j = ((b >> b_count) << (BITS-b_size) >> (BITS-b_size)).to_ulong();
p[i] = j;
b_count += b_size;
}
vpint res;
rep(i, n) if (p[i] != -1) {
vint map(i); iota(all(map), 1);
shuffle(all(map), rng);
res.push_back({map[p[i]], i+1});
}
return res;
}
#include <bits/stdc++.h>
#include "Bob.h"
using namespace std;
using ll = long long;
using vint = vector<int>;
using vll = vector<ll>;
using pint = pair<int, int>;
using vpint = vector<pint>;
#define fi first
#define se second
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()
#define rep(i, n) for (int i = 0; i < (n); i++)
#define rrep(i, n) for (int i = (n)-1; i >= 0; i--)
#define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define RFOR(i, a, b) for (int i = (a)-1; i >= (b); i--)
const int BITS = 60000;
const int VBITS = 60;
const int n = 5000;
const int seed = 18342;
ll Bob(vpint V){
mt19937_64 rng(seed);
vint p(n, -1);
sort(all(V), [](pint& a, pint& b) { return a.se < b.se; });
int i = 0;
for (auto& [mj, i1]: V) {
vint map;
while (i < i1-1) {
i++;
map = vint(i); iota(all(map), 1);
shuffle(all(map), rng);
}
vint remap(i+1); rep(x, i) remap[map[x]] = x;
int j = remap[mj];
p[i] = j;
}
bitset<BITS> b, b_rec;
int b_count = 0;
rrep(i, n) {
if (i == 0) continue;
int b_size = __lg(i);
int j = p[i];
if (j != -1) {
bitset<BITS> bv(j);
b |= bv << b_count;
bitset<BITS> rv((1 << b_size)-1);
b_rec |= rv << b_count;
}
b_count += b_size;
}
bitset<VBITS> xb, xb_rec;
rep(i, BITS/VBITS) {
rep(j, VBITS) {
int pos = i*VBITS+j;
if (b_rec[pos]) xb_rec[j] = b_rec[pos];
if (b_rec[pos]) xb[j] = b[pos];
}
}
if (xb_rec.count() != VBITS) while (true) {}
else {
ll x = xb.to_ullong();
return x;
}
}