#P3384. 重链剖分 / 树链剖分

重链剖分 / 树链剖分

重链剖分 / 树链剖分

题目描述

给定一棵包含 NN 个结点的树,每个结点有一个非负整数权值。指定结点 RR 为根。你需要支持以下四种操作:

  • 1 x y z:把结点 xx 到结点 yy 的最短路径上所有结点的权值都加上 zz
  • 2 x y:求结点 xx 到结点 yy 的最短路径上所有结点的权值之和;
  • 3 x z:把以结点 xx 为根的子树内所有结点的权值都加上 zz
  • 4 x:求以结点 xx 为根的子树内所有结点的权值之和。

所有查询结果均对 PP 取模。

输入格式

第一行输入四个正整数 N,M,R,PN,M,R,P,分别表示结点数、操作数、根结点编号和模数。

第二行输入 NN 个非负整数,表示各结点的初始权值。

接下来 N1N-1 行,每行输入两个整数 x,yx,y,表示结点 x,yx,y 之间有一条边。

接下来 MM 行,每行输入一个操作,格式见题目描述。

输出格式

对每个操作 2 或操作 4 输出一行,表示相应查询结果对 PP 取模后的值。

样例输入 1

5 5 2 24
7 3 7 8 0
1 2
1 5
3 1
4 1
3 4 2
3 2 2
4 5
1 5 1 3
2 1 3

样例输出 1

2
21

数据范围

  • 1N,M1051\le N,M\le 10^5
  • 1RN1\le R\le N
  • 1P2301\le P\le 2^{30}
  • 所有输入整数均在 int 范围内。
子任务编号 分值 特殊限制
1 25 N200N\le 200M200M\le 200
2 R=1R=1,且树为链 12N1-2-\cdots-N
3 只包含操作 3 和操作 4
4 无特殊限制

样例说明

树的结构如下:

树的结构

各次操作如下:

操作示意

因此依次输出 222121