struct Node {
Node *r, *d;
int x, len;
Node( Node *r, Node *d, int x, int len ) : r(r), d(d), x(x), len(len) { }
};
template <const int H>
struct SkipList {
Node *root, *p[H];
int pos[H];
SkipList() : root(0) {
forn(i, H)
root = new Node(0, root, -1, INT_MAX / 2);
}
void path( int i ) {
Node *v = root;
forn(j, H) {
while (v->len < i)
i -= v->len, v = v->r;
pos[j] = i, p[j] = v, v = v->d;
}
}
void add( int i, int x ) {
path(++i);
Node *last = 0, *v;
for (int add = 1, j = H - 1; j >= 0; j--, add &= rand() & 1) {
(v = p[j])->len++;
if (add)
last = v->r = new Node(v->r, last, x, v->len - pos[j]), v->len = pos[j];
}
}
void del( int i ) {
path(i);
for (int j = H - 1; j >= 0; j--)
if (--p[j]->len < pos[j])
p[j]->len += p[j]->r->len, p[j]->r = p[j]->r->r;
}
void out() {
Node *v = root;
while (v->d)
v = v->d;
for (v = v->r; v; v = v->r)
writeInt(v->x), writeChar(" \n"[!v->r]);
}
};
SkipList<17> skipList;