树上路径与子树操作

题目描述

Y 同学有一棵包含 NN 个节点的连通无向树,树的根节点编号为 RR。每个节点 ii1iN1 \le i \le N)上都有一个初始的非负整数权值 AiA_i

Y 同学需要在这棵树上依次进行 MM 次操作,并给定了一个全局的模数 PP。操作共分为以下四种类型:

  1. 1 x y z:将树上从节点 xx 到节点 yy 的简单路径上的所有节点的权值增加 zz
  2. 2 x y:查询树上从节点 xx 到节点 yy 的简单路径上的所有节点的权值之和,并求出其对 PP 取模后的结果。
  3. 3 x z:将以节点 xx 为根的子树内所有节点的权值增加 zz
  4. 4 x:查询以节点 xx 为根的子树内所有节点的权值之和,并求出其对 PP 取模后的结果。

请你编写程序帮助 Y 同学高效地执行这些修改与查询操作。

输入格式

第一行包含四个正整数 N,M,R,PN, M, R, P,相邻两个整数之间由一个空格隔开,分别表示树的节点个数、操作的总次数、树的根节点编号以及取模所用的模数。

第二行包含 NN 个非负整数 A1,A2,,ANA_1, A_2, \dots, A_N,相邻两个整数之间由一个空格隔开,依次表示各个节点的初始权值。

接下来的 N1N-1 行,每行包含两个整数 UUVV,表示节点 UU 和节点 VV 之间连有一条无向边。保证输入的边构成了一棵无环且连通的树。

接下来的 MM 行,每行首先包含一个整数 opop 表示操作的类型(op{1,2,3,4}op \in \{1, 2, 3, 4\}),随后包含若干个正整数,表示该操作的参数,具体格式和含义如题目描述所述。

输出格式

对于每一次操作类型为 24 的查询操作,输出一行一个整数,表示该次查询的权值总和对 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

数据范围与约定

对于 100%100\% 的数据,保证 1N1051 \le N \le 10^51M1051 \le M \le 10^51RN1 \le R \le N1P2301 \le P \le 2^{30}。输入的所有的初始权值和每次增加的值均在 32 位有符号整数的表示范围内。

在计算路径或子树的权值总和时,累加的结果可能超过 32 位有符号整数的范围,请使用 64 位整数类型进行运算和存储。

子任务编号 分值 N,MN, M \le 特殊性质
1 30 1010
2 40 10310^3
3 30 10510^5