跳转至

动态目录树

  • 参考时间限制:1.5 秒(评测环境与性能)。
  • 实际时限:在目标环境实测标准程序最慢测试文件的中位时间,乘以 2,再按 0.5 秒向上取整。
  • 内存限制:512 MB。

背景故事

电脑店正在制作一份可调整的目录索引。目录之间的连接带有权值;技术员可以搬移整棵子目录、改变观察目录树的根,或者修改一条连接的权值。查询时,他关心从当前根出发前往若干目录的公共路段。

(本故事由GPT-6重写)

形式化问题描述

给定一棵含 \(n\) 个节点的无向带权树,节点编号为 \(1,\ldots,n\) ,初始根为节点 \(1\) .边权可以为负。

依次执行以下操作。所有父子关系和子树都按操作执行前的当前根确定。

  1. 1 a b v :将以 \(a\) 为根的整棵子树移动到 \(b\) 下面。若 \(b\) 在该子树内,包括 \(a=b\) ,忽略操作;否则删除 \(a\) 与其父亲之间的边,再连接 \(a,b\) ,新边权为 \(v\) .当前根不变。
  2. 2 a :把当前根改为 \(a\) ,无向边和边权不变。
  3. 3 a b v :若 \(a,b\) 之间存在直接相连的边,把其权值改为 \(v\) ;否则忽略操作。
  4. 4 k a1 a2 ... ak :分别考察从当前根到这 \(k\) 个节点的简单路径。它们的公共部分是从根开始的一条路径,输出这条公共路径的边权之和。

当公共部分只有根节点时,答案为 \(0\) ;其他情况下答案也可能为负数。以当前根为根的子树包含整棵树,因此对当前根执行操作 1 会被忽略。

输入格式

第一行两个整数 \(n,m\) ,表示节点数和操作数。

接下来 \(n-1\) 行,每行三个整数 \(a,b,v\) ,表示一条无向边及其权值。

接下来 \(m\) 行,每行一个操作,格式如上。

输出格式

对每个操作 4,按出现顺序输出一行整数。没有查询时不输出任何内容。

样例 1

输入

7 16
1 2 2
2 3 5
2 4 6
3 5 1
3 6 3
4 7 -5
4 1 5
4 1 6
4 1 2
4 1 7
4 2 5 6
4 3 6 3 7
1 4 6 6
4 1 7
4 3 6 5 7
3 4 5 1
3 4 7 1
4 1 7
2 7
4 1 1
4 1 5
4 2 5 1

输出

8
10
2
3
7
2
11
7
17
17
11
10

样例 2

输入

3 8
1 2 -4
2 3 1
4 2 2 3
1 1 3 9
1 2 3 8
3 1 3 9
2 3
4 2 1 2
1 1 3 7
4 2 1 2

输出

-4
1
0

样例 3

输入

2 0
1 2 0

输出


样例解释

样例 1 的首次双点查询询问节点 \(5,6\) .两条路径共享 \(1\to2\to3\) ,边权之和为 \(2+5=7\) .

样例1中通往节点5与6的路径共享从1到3的前缀

粗线表示公共路径,边旁的数是边权。

样例 2 的三个答案依次为 \(-4,1,0\) .其中两次把子树移入自身的操作,以及一次修改不存在边的操作,都被忽略。样例 3 没有操作,因此输出为空。

数据范围与保证

对 100% 的数据:\(2\le n\le200000\) ,\(0\le m\le200000\) ,所有初始及修改后的边权满足 \(|v|\le10000\) .节点编号均在 \(1,\ldots,n\) 内,初始边构成一棵树。

每次查询满足 \(1\le k\le200000\) ,查询节点互不相同;所有查询的 \(k\) 之和不超过 \(200000\) .

分值比例 额外条件
100% 无额外条件