#P2972. 动态树子树加子树求和(Dynamic Tree Subtree Add Subtree Sum)

动态树子树加子树求和(Dynamic Tree Subtree Add Subtree Sum)

动态树子树加子树求和(Dynamic Tree Subtree Add Subtree Sum)

问题描述

给定一棵含 N N 个顶点的树,顶点编号 0 0 N1 N-1 ,每条边为 (ui,vi) (u_i, v_i) ,每个顶点 i i 初始值为 ai a_i

处理 Q Q 个查询,类型如下:

  • 0 u v w x:删除边 (u,v) (u, v) ,并添加新边 (w,x) (w, x) (保证操作后仍为树)。
  • 1 v p x:将边 (v,p) (v, p) 视为父边(即 p p v v 的父节点),对以 v v 为根的子树中所有顶点的值加上 x x
  • 2 v p:将边 (v,p) (v, p) 视为父边(即 p p v v 的父节点),输出以 v v 为根的子树中所有顶点的值之和。

注意:对类型 1 和 2 查询,(v,p) (v, p) 必须是当前树中的一条边;子树定义基于将该边定向为 pv p \to v 后,v v 所在的连通分支(即以 v v 为根、远离 p p 的部分)。

约束条件

  • 2N2×105 2 \leq N \leq 2 \times 10^5
  • 1Q2×105 1 \leq Q \leq 2 \times 10^5
  • 0ai107 0 \leq a_i \leq 10^7
  • 0u,v,w,x<N 0 \leq u, v, w, x < N
  • 0x107 0 \leq x \leq 10^7
  • 图始终为树;对类型 0 查询,(u,v) (u,v) 存在;对类型 1/2 查询,(v,p) (v,p) 存在。

输入

N QN\ Q
a0 a1  aN1a_0\ a_1\ \cdots\ a_{N-1}
u0 v0u_0\ v_0
u1 v1u_1\ v_1
:
uN2 vN2u_{N-2}\ v_{N-2}
Query₀
Query₁
:
QueryQ1_{Q-1}

5 7
1 10 100 1000 10000
0 1
1 2
2 3
1 4
2 1 0
1 1 4 100000
2 2 3
0 1 2 2 0
2 0 2
0 2 3 3 1
2 1 4
11110
310111
210011
401111