int n, root = 0, tot = 0;
struct Tree {
int ch[2], fth, num, val, max_val, sze;
Tree() { ch[0] = ch[1] = fth = num = val = max_val = 0; }//NOLINT
} tree[max_n];//NOLINT
inline void Update(int p) {
tree[p].max_val = max(max(tree[tree[p].ch[0]].max_val, tree[tree[p].ch[1]].max_val), tree[p].val);
tree[p].sze = tree[tree[p].ch[0]].sze + tree[tree[p].ch[1]].sze + 1;
}
inline void Rotate(int x, int &r) {
int y = tree[x].fth;
int z = tree[y].fth;
if (r == y)r = x;
else if (tree[z].ch[0] == y)tree[z].ch[0] = x;
else if (tree[z].ch[1] == y)tree[z].ch[1] = x;
tree[x].fth = z;
tree[y].fth = x;
if (tree[y].ch[0] == x) {
tree[tree[x].ch[1]].fth = y;
tree[y].ch[0] = tree[x].ch[1];
tree[x].ch[1] = y;
} else if (tree[y].ch[1] == x) {
tree[tree[x].ch[0]].fth = y;
tree[y].ch[1] = tree[x].ch[0];
tree[x].ch[0] = y;
}
Update(y);
Update(x);
}
inline void Splay(int x, int &r) {
while (r != x) {
int y = tree[x].fth;
int z = tree[y].fth;
if (r != y) {
if ((tree[z].ch[0] == y) ^ (tree[y].ch[0] == x))Rotate(x, r);
else Rotate(y, r);
}
Rotate(x, r);
}
}
void Insert(int &p, int a, int c, int t, int fth) {
if (p == 0) {
p = ++tot;
tree[p].sze = 1, tree[p].val = a, tree[p].max_val = a;
tree[p].fth = fth, tree[p].num = t;
Splay(p, root);
return;
}
int val = max(tree[p].val, tree[tree[p].ch[1]].max_val);
int sze = tree[tree[p].ch[1]].sze + 1;
if (val > a || sze > c)Insert(tree[p].ch[1], a, c, t, p);
else Insert(tree[p].ch[0], a, c - sze, t, p);
}