认真思考?抓紧时间!
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 512 M,其他语言1024 M
64bit IO Format: %lld

题目描述

【题目背景】
2019年,nzhtl挑战10分钟手写平衡树,一战告捷!
2023年,在华农校赛,聪明的你,需要几分钟来A掉这道题呢?

【题目描述】

给你一棵树,默认1号节点为根节点,每条边都有边权,要求你维护以下操作
  • 1 x y :查寻节点x到y的路径上边权的平方和
  • 2 x y z :将节点x到节点y的路径所经过的边的边权增加z
  • 3 x y z :将节点x到节点y的路径所经过的边的边权修改为z

输入描述:

第一行两个数n,m(1\leq n,m\leq 100000)
接下来n-1行,每行3个数x,y,z,表示s与y之间有一条边权为z的边(1\leq z\leq 5000)
接下来m行,表示你所需要维护的操作

输出描述:

对于每一次的操作1,输出一个数,表示两点路径途径边的边权的平方和
由于答案可能很大,因此只需输出对1e9+7取模的结果即可
示例1

输入

复制
8 5
1 2 1
1 3 5
1 6 1
1 7 10
1 8 10
2 4 3
2 5 5
3 6 4 5
1 6 4
1 2 5
2 8 5 5
1 8 6

输出

复制
75
25
250