如果你热爱大数据,你应该熟悉以分布式方式运行代码。这总是需要大量的基础设施元素协同工作,以使并行计算成为可能。其中一个元素通常是调度程序,它决定了哪些已调度的任务应该以某种“公平”和“高效”的方式立即启动。
基于任务的性质(测试、长时间运行、实时等),它们被组织成一种可以表示为有根树的层次结构。
以下问题受到一种称为层次主导资源公平性(Hierarchical Dominant Resource Fairness, HDRF)的现代调度算法的启发。
给定一棵以顶点 1 为根的树 $T$,它包含 $n$ 个顶点。树中的每个顶点 $i$ 都有一个唯一的优先级 $v_i$。对于每个顶点,我们可以计算值 $r_i$:即顶点 $i$ 的子树(包含自身)中最小的 $v_i$。
考虑以下树遍历算法:
- 从根顶点开始。
- 选择当前顶点的直接子节点中 $r_i$ 值最小的一个。
- 移动到该子节点。
- 如果当前顶点是叶子节点,将其记录下来并从树中删除(当我们删除一个顶点时,我们会重新计算所有 $r_i$)。否则,回到第 2 步。
从第 1 步开始重复上述过程,直到树为空。
给定树 $T$ 和数字 $v_i$,计算顶点被记录下来的顺序。
输入格式
第一行包含一个整数 $n$ ($2 \le n \le 100\,000$),表示树中的顶点数。 第二行包含 $n-1$ 个整数,其中第 $i$ 个整数 $p_i$ ($1 \le p_i \le n$) 是顶点 $(i+1)$ 在树中的父节点。顶点的编号为 $1$ 到 $n$。保证输入构成一棵以顶点 1 为根的有效有根树。 第三行包含 $n$ 个不同的整数 $v_1, v_2, \dots, v_n$ ($0 \le v_i \le 10^9$),表示顶点的优先级。
输出格式
按算法记录顶点的顺序输出 $n$ 个顶点。
样例
输入 1
5 4 4 1 1 3 5 2 1 4
输出 1
3 2 4 5 1