修复排列
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

\hspace{15pt}小TM给了一个长度为 n排列数组 p_1,p_2,\dots,p_n 给小TU。然而有 n 次奇怪的力量对这个数组进行了破坏:每次破坏会选择一个下标 {\rm id}_i,使得 p_{{\rm id}_i} 变为 0,即第 i 次破坏完后,p_{{\rm id}_1},p_{{\rm id}_2},\dots,p_{{\rm id}_i} 都会变成 0
\hspace{15pt}TU很爱惜这个排列,所以每次被破坏后都会对数组进行修复。他的修复基于一个长度为 n 的排列 d_1,d_2,\dots,d_n,对于一次修复操作:
\hspace{23pt}\bullet\,1n 中任选一个整数 i,然后用 d_i 替换小TU的排列中第 i 个元素。
\hspace{15pt}你需要告诉小TU,每次被破坏后最少需要执行多少次操作能将数组恢复为任一合法的长度为 n 的排列。每次修复的答案完全独立,不会实际修改原始数组。

【名词解释】
\hspace{15pt}长度为 n排列:由 1,2,\dots,nn 个整数、按任意顺序组成的数组(每个整数均恰好出现一次)。例如,\{2,3,1,5,4\} 是一个长度为 5 的排列,而 \{1,2,2\}\{1,3,4\} 都不是排列,因为前者存在重复元素,后者包含了超出范围的数。

输入描述:

\hspace{15pt}第一行输入一个整数 n \left(1 \leq n \leq 2 \times 10^5\right)
\hspace{15pt}第二行输入 n 个两两不同的整数 p_1,p_2,\dots,p_n \left(1 \leq p_i \leq n\right),代表初始排列。
\hspace{15pt}第三行输入 n 个整数 {\rm id}_1,{\rm id}_2,\dots,{\rm id}_n \left(1 \leq {\rm id}_i \leq n\right),其中第 i 个数字 {\rm id}_i 代表第 i 次破坏的下标。
\hspace{15pt}第四行输入 n 个两两不同的整数 d_1,d_2,\dots,d_n \left(1 \leq d_i \leq n\right),代表修复操作依赖的排列。

输出描述:

\hspace{15pt}在一行上输出 n 个整数,代表每次遭受破坏后恢复需要的最少操作次数。
示例1

输入

复制
4
1 2 3 4
1 2 3 4
2 1 3 4

输出

复制
2 2 3 4

说明

\hspace{15pt}在这个样例中,对于第一次破坏,p'=\{0,2,3,4\},其中一种最优修复方案是:
\hspace{23pt}\bullet\,第一次修复操作选择 i=1,随后用 d_1=2 替换第一个元素,数组变为 \{{\color{orange}{2}},2,3,4\}
\hspace{23pt}\bullet\,第二次修复操作选择 i=2,随后用 d_2=1 替换第二个元素,数组变为 \{2,{\color{orange}{1}},3,4\}
\hspace{15pt}我们可以证明,至少需要 2 次操作才能恢复为排列。
示例2

输入

复制
5
1 2 3 4 5
4 4 4 1 2
2 1 4 5 3

输出

复制
3 3 3 5 5