luogu#P5127. 子异和

子异和

题目描述

小L和小K正在激烈地讨论着。

(你不用知道谁说的哪句话……)

“你知道非空子集吗?”

“当然知道啊!比如说集合{1,2,3}\{1,2,3\},它的所有非空子集就是$\{1\},\{2\},\{3\},\{1,2\},\{2,3\},\{1,3\},\{1,2,3\}$。”

“那你知道每个非空子集里的数的亦或和是多少吗?”

“也知道啊,不就是1,2,3,12=3,23=1,13=2,123=01,2,3,1⊕2=3,2⊕3=1,1⊕3=2,1⊕2⊕3=0吗。”

“那你知道它们的和是多少吗?我们把它叫做子异和。”

“子异和……这个名字好奇怪啊,不过我知道,是1+2+3+3+1+2+0=121+2+3+3+1+2+0=12。”

“那我问你,{a1,a2,...,an}\{a_1,a_2,...,a_n\}的子异和是多少?”

“慢慢暴力算呗!”

“如果n200000n\le 200000呢?”

“……”

“如果把问题放在一颗树上呢?”

“……那你会不会做啊?”

“当然……不会做……”

现在,只有你能帮助小L和小K了,请你帮忙解决这个问题。

为了更清晰的表达题意,我们再做一次解释。

有一个nn个节点的树,总共有mm次操作。这些操作按照操作顺序输入。每次操作可能是询问或修改。

每次询问操作会给出两个节点编号a,ba,b。根据常识,a,ba,b在树上有唯一路径。我们设这条路径经过的所有点的点权集合为SS。你要输出SS的子异和。答案mod (109+7)mod\space(10^9+7)

每次修改操作会给出两个节点编号a,ba,b与一个整数值cc。你要将节点aa到节点bb的唯一路径上的所有点的点权分别异或cc

这里的集合指可重集合

输入格式

第一行三个正整数n,mn,m

接下来n1n-1行,每行两个正整数a,ba,b,表示节点aabb之间有一条边。不会出现重边与自环。

接下来一行nn个非负整数,第ii个非负整数表示ii节点的初始点权。

接下来mm行,每行若干个整数,表示mm个操作的信息。每行第一个整数只可能是1122。如果是11,则此操作为询问,接下来两个数为a,ba,b;如果是22,则此操作为修改,接下来三个数为a,b,ca,b,c

输出格式

对于每一个询问,输出一行表示答案。

3 4
1 2
1 3
1 1 1
1 1 1
2 1 3 1
2 3 3 1
1 1 3
1
2

提示

样例解释:

第一次询问,1111的路径经过11号节点,点权组成的集合为{1}\{1\},子异和为11

两次修改后,11号点点权为0033号点点权为11

第二次询问,1133的路径经过的点权集合为{0,1}\{0,1\},子异和为0+1+1=20+1+1=2

本题共有1010个测试点,每个测试点1010分,总分为100100分。

| 测试点编号 | nn的范围 | mm的范围 |特殊性质 | | :----------: | :----------: | :----------: | :----------: | :----------: | | 121-2 | 1n10001\le n\le 1000 | 1m10001\le m\le 1000 | 无 | | 353-5 | 1n2000001\le n\le 200000 | 1m2000001\le m\le 200000 | 每条边连接的两个节点编号均相邻 | | 6106-10 | 1n2000001\le n\le 200000 | 1m2000001\le m\le 200000 | 无 |

对于100%100\%的数据:

输入的数均为不大于109+710^9+7的非负整数,1a,bn1\le a,b\le n