地址:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1322
1322: ZZY‘s new company
Time Limit: 3 Sec
Memory Limit: 312 MB
Submit: 153
Solved: 18
[ Submit][ Status][ Web Board]
Description
zzy开了一家公司,然后他为公司制定了人事制度:为每个员工都定一个直接的上属(除了zzy自己),这样就把公司表示成了一个树形的人事关系图,树的最顶端就是zzy自己。如果a的直接上属是b则称a是b的一级下属,接下去的依次称为2级、3级……k级下属。
由于如zzy奇葩的想法,他将改变一部分员工的工资,方法依旧是将员工原来的工资异或一个数,得到新的工资。
Input
每个例子的第一行含两个数N和Q,表示zzy找了N(0
接下来的N行,每行有两个数Ui和Vi(第i行表示id为i的员工资料),表示员工i的上属编号为Ui,原始工资为Vi。然后有Q行,每行的第一个数是a,为0或者1表示一种询问。
如果a为0,则这行还有三个数b,c,v(0<=b<=N, 0 < c, v<=1000000000),表示zzy将b的所有c级下属工资全部异或v,得到新工资。
如果a为1,则这行还有两个数b,c(0<=b<=N, 0 < c),询问b的所有c级下属的总工资。
Output
对于每个修改,如果b没有c级的下属则无视这个修改。
对于每个询问,输出一个数来表示结果,如果b没有c级下属则输出-1。
Sample Input
3 3
0 1
1 2
2 4
1 0 1
0 0 1 3
1 0 1
3 4
0 1
0 2
0 3
1 0 1
0 0 1 6
1 0 1
1 0 2
Sample Output
1
2
6
16
-1
因为更新是异或操作,所以需要按二进制来建线段树,建了30棵线段树,分别表示在这个区间在这一位二进制上有多少个1.
然后就是更新距离为c的点,我们将点按深度升序和dfs序排序,那么深度相同的点就在一块了,在记录每个点dfs序产生的儿子区间,每次操作就是取这俩个区间的交集。
#include
#include
#include
#include
#include
#include
#include
#include