bzoj#P3589. 动态树

动态树

题目描述

别忘了这是一棵动态树,每时每刻都是动态的。

小明要求你在这棵树上维护两种事件:

事件 00
这棵树长出了一些果子,即某个子树中的每个节点都会长出 kk 个果子。

事件 11
小明希望你求出几条树枝上的果子数。一条树枝其实就是一个从某个节点到根的路径的一段。

每次小明会选定一些树枝,让你求出在这些树枝上的节点的果子数的和。注意,树枝之间可能会重合,这时重合的部分的节点的果子只要算一次。

输入格式

第一行一个整数 nn,即节点数。
接下来 n1n-1 行,每行两个数字 u,vu,v。表示果子 uu 和果子 vv 之间有一条直接的边。节点从 11 开始编号。
再接下来一个整数 nQnQ,表示事件。
最后 nQnQ 行,每行开头要么是 00,要么是 11
如果是 00,表示这个事件是事件 00。这行接下来的 22 个整数 u,deltau,delta 表示以 uu 为根的子树中的每个节点长出了 deltadelta 个果子。
如果是 11,表示这个事件是事件 11。这行接下来一个整数 kk,表示这次询问涉及 kk 个树枝。接下来 kk 对整数 uk,vku_k,v_k,每个树枝从节点 uku_k 到节点 vkv_k 。由于果子数可能非常多,请输出这个数模 2312^{31} 的结果。

输出格式

对于每个事件 11,输出询问的果子数。

5
1 2
2 3
2 4
1 5
3
0 1 1
0 2 3
1 2 3 1 1 4
13

数据规模与约定

对于 100%100\% 的数据,1n2×1051\le n\le 2\times 10^51nQ2×1051\le nQ\le 2\times 10^5k=5k=5

生成每个树枝的过程是这样的:先在树中随机找一个节点,然后在这个节点到根的路径上随机选一个节点,这两个节点就作为树枝的两端。

题目来源

By 佚名提供