小 Q 是一个热爱学习的人,他经常去维基百科学习计算机科学。
就在刚才,小 Q 认真地学习了一系列位运算符,其中按位异或的运算符 $\oplus$ 对他影响很大。按位异或的运算符是双目运算符。按位异或具有交换律,即 $i \oplus j = j \oplus i$。
他发现,按位异或可以理解成被运算的数字的二进制位对应位如果相同,则结果的该位置为 $0$,否则为 $1$,例如:$1(01) \oplus 2(10) = 3(11)$。
他还发现,按位异或可以理解成参与运算的数字的每个二进制位都进行了不进位的加法,例如:$3(11) \oplus 3(11) = 0(00)$。
现在小 Q 有一棵 $n$ 个结点的无根树 $T$,结点依次编号为 $1$ 到 $n$,其中结点 $i$ 的权值为 $v_i$。
定义一棵树的价值为它所有点的权值的异或和,一棵树 $ T $ 的连通子树就是它的一个连通子图,并且这个图也是一棵树。
小 Q 想要在这棵树上玩切树游戏,他会不断做以下两种操作:
- Change x y,将编号为 $x$ 的结点的权值修改为 $y$。
- Query k,询问有多少棵 $T$ 的非空连通子树,满足其价值恰好为 $k$。
小 Q 非常喜(bu)欢(hui)数学,他希望你能快速回答他的问题,你能写个程序帮帮他吗?