可以发现,对于查询操作,不妨设 \(father_x=y\) 则我们要求的其实就是包含 \(x,y\) 的连通块的大小 \(S\) 减去 \(x\) 的子树的大小 \(siz_x\),再乘上 \(siz_x\),即为 \((S-siz_x)siz_x\)。
对于查询连通块的大小,我们可以直接维护并查集,对于子树的维护,我们可以先把所有的操作 \(1\) 离线下来,然后按照 \(dfs\) 序给每个节点编号,方便维护子树的大小,然后我们利用差分的思想,直接对整个根节点对应的子树加上 \(siz_x\) 再对节点 \(x\) 对应的子树减去 \(siz_x\) 那么我们每次查询子树大小就相当于查询子树内所有点的权值总和。
