CF1942H Farmer John's Favorite Intern

题目描述

[Peaches...](https://soundcloud.com/jackblack-sc/peaches) ⠀ Ruby 刚刚通过编程竞赛赢得了 Farmer John 农场的实习机会!作为新招募的实习生,Ruby 的任务是维护 Farmer John 的桃树,这棵树有 $n$ 个结点,以结点 $1$ 为根。每个结点初始时有 $a_i = 0$ 个桃子,并且有两种事件可能发生: 1. 在某个结点 $x$ 处的生长事件:Ruby 必须选择 $x$ 的父结点或 $x$ 的子树中的任意一个结点,并将其桃子数量增加 $1$。 2. 在某个结点 $x$ 处的收获事件:Ruby 必须选择 $x$ 的子树中的一个结点,并将其桃子数量减少 $1$。注意,这与生长事件可选的结点集合不同。 注意,$x$ 的子树包括结点 $x$ 本身。Ruby 还得到了一个长度为 $n$ 的数组 $b$。当且仅当对每个结点 $i$ 都有 $a_i \ge b_i$ 时,这棵桃树才被认为是健康的。 Ruby 需要执行 $q$ 个操作,操作有两种类型: - 1 x v — 在结点 $x$ 上执行 $v$ 次生长事件。Ruby 每次可以选择不同的结点进行增加。 - 2 x v — 在结点 $x$ 上执行 $v$ 次收获事件。Ruby 每次可以选择不同的结点进行减少。 对于每个操作前缀,Ruby 想知道是否存在一种顺序执行这些操作的方法,使得最终的桃树是健康的。注意,Ruby 不能执行会导致某个 $a_i$ 变为负数的收获事件。 每个前缀互相独立,也就是说,对于某个操作,Ruby 可以在包含该操作的每个前缀中选择不同的结点来执行事件。

输入格式

第一行包含一个整数 $t$($1 \le t \le 10^4$)——表示测试用例的数量。 每个测试用例的第一行包含两个整数 $n$ 和 $q$($1 \le n, q \le 2 \times 10^5$)——表示树的结点数和操作数。 第二行包含 $n-1$ 个整数 $p_2, p_3, \ldots, p_n$($1 \le p_i < i$)——表示每个结点的父结点编号。 第三行包含 $n$ 个整数 $b_1, b_2, \ldots, b_n$($0 \le b_i \le 10^6$)——表示每个结点所需的最少桃子数。 接下来的 $q$ 行,每行描述一个操作,包含三个整数 $t, x, v$($1 \le t \le 2$,$1 \le x \le n$,$1 \le v \le 10^6$)。如果 $t=1$,表示在结点 $x$ 上执行 $v$ 次生长事件;如果 $t=2$,表示在结点 $x$ 上执行 $v$ 次收获事件。 保证所有测试用例中 $n$ 的总和不超过 $2 \times 10^5$,$q$ 的总和不超过 $2 \times 10^5$。

输出格式

对于每个测试用例,输出 $q$ 行。第 $i$ 行输出 "YES"(不区分大小写),如果 Ruby 能够在某种顺序下完成前 $i$ 个操作后使桃树健康,否则输出 "NO"。 你可以用任意大小写输出答案,例如 "yEs"、"yes"、"Yes" 和 "YES" 都会被认为是肯定的回答。

说明/提示

对于第一个测试用例中包含操作 $1, 2, \ldots, 5$ 的前缀,Ruby 可以按如下顺序执行操作: 1. Ruby 执行操作 $2$,选择将 $a_4$ 增加 $9$,$a_5$ 增加 $8$。 2. Ruby 执行操作 $1$,选择将 $a_1$ 增加 $5$,$a_3$ 增加 $2$,$a_6$ 增加 $4$,$a_8$ 增加 $3$。 3. Ruby 执行操作 $3$,选择将 $a_2$ 增加 $7$。 4. Ruby 执行操作 $4$,选择将 $a_2$ 减少 $1$。 5. Ruby 执行操作 $5$,选择将 $a_7$ 增加 $1$。 由 ChatGPT 4.1 翻译