子异和

题目描述

小L和小K正在激烈地讨论着。 (你不用知道谁说的哪句话……) “你知道非空子集吗?” “当然知道啊!比如说集合$\{1,2,3\}$,它的所有非空子集就是$\{1\},\{2\},\{3\},\{1,2\},\{2,3\},\{1,3\},\{1,2,3\}$。” “那你知道每个非空子集里的数的亦或和是多少吗?” “也知道啊,不就是$1,2,3,1⊕2=3,2⊕3=1,1⊕3=2,1⊕2⊕3=0$吗。” “那你知道它们的和是多少吗?我们把它叫做子异和。” “子异和……这个名字好奇怪啊,不过我知道,是$1+2+3+3+1+2+0=12$。” “那我问你,$\{a_1,a_2,...,a_n\}$的子异和是多少?” “慢慢暴力算呗!” “如果$n\le 200000$呢?” “……” “如果把问题放在一颗树上呢?” “……那你会不会做啊?” “当然……不会做……” 现在,只有你能帮助小L和小K了,请你帮忙解决这个问题。 **为了更清晰的表达题意,我们再做一次解释。** 有一个$n$个节点的树,总共有$m$次操作。这些操作按照操作顺序输入。每次操作可能是询问或修改。 每次询问操作会给出两个节点编号$a,b$。根据常识,$a,b$在树上有唯一路径。我们设这条路径经过的所有点的点权集合为$S$。你要输出$S$的子异和。答案$mod\space(10^9+7)$。 每次修改操作会给出两个节点编号$a,b$与一个整数值$c$。你要将节点$a$到节点$b$的唯一路径上的所有点的点权分别异或$c$。 **这里的集合指可重集合**

输入输出格式

输入格式


第一行三个正整数$n,m$。 接下来$n-1$行,每行两个正整数$a,b$,表示节点$a$和$b$之间有一条边。不会出现重边与自环。 接下来一行$n$个非负整数,第$i$个非负整数表示$i$节点的初始点权。 接下来$m$行,每行若干个整数,表示$m$个操作的信息。每行第一个整数只可能是$1$或$2$。如果是$1$,则此操作为询问,接下来两个数为$a,b$;如果是$2$,则此操作为修改,接下来三个数为$a,b,c$。

输出格式


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

输入输出样例

输入样例 #1

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

输出样例 #1

1
2

说明

样例解释: 第一次询问,$1$到$1$的路径经过$1$号节点,点权组成的集合为$\{1\}$,子异和为$1$。 两次修改后,$1$号点点权为$0$,$3$号点点权为$1$。 第二次询问,$1$到$3$的路径经过的点权集合为$\{0,1\}$,子异和为$0+1+1=2$。 本题共有$10$个测试点,每个测试点$10$分,总分为$100$分。 | 测试点编号 | $n$的范围 | $m$的范围 |特殊性质 | | :----------: | :----------: | :----------: | :----------: | :----------: | | $1-2$ | $1\le n\le 1000$ | $1\le m\le 1000$ | 无 | | $3-5$ | $1\le n\le 200000$ | $1\le m\le 200000$ | 每条边连接的两个节点编号均相邻 | | $6-10$ | $1\le n\le 200000$ | $1\le m\le 200000$ | 无 | 对于$100\%$的数据: 输入的数均为不大于$10^9+7$的非负整数,$1\le a,b\le n$。