CF396C On Changing Tree

题目描述

给定一棵有根树,包含 $n$ 个编号为 $1$ 到 $n$ 的顶点。树的根为顶点 $1$。 初始时,每个顶点上的数字均为 $0$。接下来有 $q$ 次操作,每次操作有两种类型: - 操作格式为:$1\ v\ x\ k$。对于该操作,需要对顶点 $v$ 上的数字加上 $x$;对于距离 $v$ 为 $1$ 的所有后代顶点,加上 $x-k$;对于距离 $v$ 为 $i$ 的所有后代顶点,加上 $x-i \cdot k$。两个顶点之间的距离指的是它们之间最短路径的边数。 - 操作格式为:$2\ v$。对于该操作,询问顶点 $v$ 上当前的数字,输出该数字对 $1000000007$ 取模后的结果。 请你依次处理所有操作。

输入格式

第一行包含一个整数 $n$($1 \leq n \leq 3 \cdot 10^5$),表示树的顶点数量。第二行包含 $n-1$ 个整数 $p_2, p_3, \ldots, p_n$($1 \leq p_i < i$),其中 $p_i$ 表示顶点 $i$ 的父节点编号。 第三行包含一个整数 $q$($1 \leq q \leq 3 \cdot 10^5$),表示操作次数。接下来 $q$ 行,每行一个操作。每行的第一个数为 $type$,表示操作类型。若 $type=1$,后接三个整数 $v, x, k$($1 \leq v \leq n$,$0 \leq x < 10^9+7$,$0 \leq k < 10^9+7$)。若 $type=2$,后接一个整数 $v$($1 \leq v \leq n$),表示询问顶点 $v$ 的当前值。

输出格式

对于每个第二类型的操作,输出一行一个整数,表示该顶点当前的数字对 $1000000007$ 取模后的值。

说明/提示

有关有根树的介绍可以参考:http://en.wikipedia.org/wiki/Tree\_(graph\_theory)。 由 ChatGPT 5 翻译