出题
买买买
题目大意
一个永生的家族里面有 \(n\) 个人,它们的祖先后代关系组成了一个树的结构。
这个家族里面的人都很喜欢买东西!但一个人的力量是微小的,每个人要买东西的时候会向自己的所有后代筹钱(当然自己也出钱)。
一次筹钱可以这样定义:一个节点首先收到所有儿子节点筹到的钱,然后他会想办法去银行借钱,使钱变为原来的 \(b\) 倍。此时他放入自己的 \(a\) 元。最后若这个点不是发起筹钱的节点,它就把这些钱交给自己的父亲节点。(不考虑向银行还钱)
筹钱可能有多次,银行能借出的钱的倍数是一定的,每一个时刻所有人能拿出的钱 \(a\) 是相同的,但对于不同的时刻, \(a\) 可能不同。
当然,这个家族不是一成不变的。虽然没有人死亡,但可能有人出生。一共出生了 \(m\) 个新的节点。
请你对于每次筹钱,求出筹到的总钱数。这个家族的人都很聪明谨慎,他们只是想让你写个程序帮忙验证一下。所以请输出答案 \(\bmod\ 998244353\) 后的结果。
形式化题面:
给出一个 \(n\) 个点的有根树,根为 \(1\) 。
在 \(q\) 个时刻,每个时刻可能发生两种事件:
-
\(x\) 节点多了一个后代。这个后代的编号为\(n+1\),随后令\(n\gets n+1\)。
-
对于 \(x\) ,计算 \(\large f_x\),\(\large f_x=a+b\sum\limits_{y \in son[x]}f_y\) 并输出。
其中增加的总点数为 \(m\) 。
输入格式
第一行三个数,\(n,m,b\),意义见题面。
第二行 \(n-1\) 个数,表示 \(i\) 节点的父亲。
随后一行一个数 \(q\),代表 \(q\) 个事件。
之后的 \(q\) 行,每行可能是以下两种情况
\(1\ x\),表示 \(x\) 节点多了一个新的儿子节点。
\(2\ x\ a\),表示筹钱。
输出格式
对于每一个 \(2\) 操作,输出能筹到的钱 \(\bmod\ 998244353\) 的结果。
数据范围
文中所有出现的数字均为非负整数。
对于 \(30\%\) 的数据,满足 \(1\le n+m, q\le 2 \times 10^3\)。
另外 \(5\%\) 的数据,满足 \(b=1\)。
另外 \(10\%\) 的数据,满足 \(m=0\)。
另外 \(15\%\) 的数据,满足任何时刻,对于任意 \(i > 1\),\(i\) 的父亲是 \(i-1\)。也就是说,任意时刻树的形态都是一条链。
对于 \(80\%\) 的数据,满足 \(1\le n+m, q\le 3 \times 10^5\)
对于 \(100\%\) 的数据,满足 \(1\le n,m, q\le5 \times10^5 , 1\le a, b < 998244353\)。
PS:请熊老师开大栈空间,谢谢。