#P1050. 巡逻树

巡逻树

有一棵 nn 个点 n1n-1 条边的树,每条边具有初始长度 00 以及特征值 wiw_i 。小核桃在树上巡逻,对于第 ii 条边而言,小核桃每巡逻过一次该边,该边的长度就会增加 wiw_i 。接下来会给你 mm 个操作,每个操作有两种:

  • 操作 11 : 给定三个数 ai,bi,cia_i,b_i,c_i ,小核桃在 aia_ibib_i 的道路上又跑了 cic_i 次。

  • 操作 22 : 询问整棵树任意两点的距离和。

为了减少输出量,你无需对每次询问都输出答案,而是存储所有答案并求和。最终输出所有询问之和对 109+710^9+7 取模之后的结果。

输入格式

第一行输入一个整数 nn ,代表树的节点个数。

接下来 n1n-1 行每行输入三个数 ai,bi,wia_i,b_i,w_i,代表一条树的边的信息。

接下来一行输入一个整数 mm,代表总的操作次数。

接下来 mm 行每行首先输入一个整数 op (1op2)op \ (1 \le op \le 2),代表此次操作的种类,若 op=1op=1 ,则再输入三个数 ai,bi,ci(1ai,bin,1ci104)a_i,b_i,c_i(1 \le a_i,b_i \le n, 1 \le c_i \le 10 ^ 4)

输出格式

输出一行一个整数表示所有询问之和。

3
1 2 10
2 3 1
3
2
1 1 3 3
2
66

样例解释:

对于第一个查询答案是 00 ,第二个操作小核桃把121-2232-3 两条边均走了 33 遍,此时 121-2 边长为 3030232-3 边长为 33 。对于第二个询问,答案就是 dist(1,2)+dist(1,3)+dist(2,3)=30+3+33=66\text{dist}(1,2)+\text{dist}(1,3)+\text{dist}(2,3)=30+3+33=66,因此两次查询的总和为 0+66=660+66=66

测试点说明

测试点编号 n,mn,m \leq 特殊性质
1 10 树是一条链
2 1000
3 10510^5
4-5 200
6-7 2000
8-10 21052*10^5