const double alpha = 0.75;
const ull VAL_RT = 1ull << 63;
namespace wbt {
struct Node {
ull val; int lc, rc, sz;
} tr[N]; int nn, rt, buf[N], top;
inline ull f(ull val) { return (val & -val) >> 1; }
inline Node &lc(int p) { return tr[tr[p].lc]; }
inline Node &rc(int p) { return tr[tr[p].rc]; }
inline int addNode() { tr[++nn] = {0, 0, 0, 1}; return nn; }
void pa(int p) { if(!p) return; pa(tr[p].lc); buf[++top] = p; pa(tr[p].rc); }
int build(ull val, int l, int r) {
if(l > r) return 0;
if(l == r) return tr[buf[l]] = {val, 0, 0, 1}, buf[l];
int mid = (l + r) >> 1, cur = buf[mid];
tr[cur] = {val, build(val - f(val), l, mid - 1), build(val + f(val), mid + 1, r), 0};
tr[cur].sz = lc(cur).sz + rc(cur).sz + 1;
return cur;
}
void insert(int &p, int k, ull val = VAL_RT, bool flag = false) {
if(!p) return assert(k == 1), tr[p = addNode()].val = val, void();
++tr[p].sz;
if(k <= lc(p).sz + 1) {
bool tag = !flag && max(lc(p).sz + 1, rc(p).sz) >= alpha * tr[p].sz;
insert(tr[p].lc, k, val - f(val), flag | tag);
if(tag) pa(p), p = build(val, 1, top), top = 0;
} else {
bool tag = !flag && max(lc(p).sz, rc(p).sz + 1) >= alpha * tr[p].sz;
insert(tr[p].rc, k - lc(p).sz - 1, val + f(val), flag | tag);
if(tag) pa(p), p = build(val, 1, top), top = 0;
}
}
}