假设没有操作 1 1 ,那显然就是把 dfs 序求出来,子树区间加,子树区间查询,用线段树维护,。
考虑有操作 1 1 :
以 为根,建线段树。
假设此时的根变为 r r 。
然后发现求以 为根的 LCA(u,v) LCA ( u , v ) ,相当于求 LCA(u,r)⊕LCA(u,v)⊕LCA(u,r) LCA ( u , r ) ⊕ LCA ( u , v ) ⊕ LCA ( u , r ) , ⊕ ⊕ 为对称差(即 1⊕2⊕1=2 1 ⊕ 2 ⊕ 1 = 2 )。
然后子树区间加和子树区间查询时要判断, r r 是否在以 为根的 u u 的子树中。
如果不在,直接按根为 时做;
如果在,求以
1
1
为根的 的子树的补集即可:
对于操作
1
1
,先给直接给整棵树加,然后子树减,然后自己再加;
对于操作 ,先给求整棵树和减去子树和再加上自己。
复杂度 O(nlogn) O ( n log n ) 。