CF1797D Li Hua and Tree

题目描述

李华有一棵包含 $n$ 个结点和 $n-1$ 条边的树。树的根为结点 $1$。每个结点 $i$ 有一个重要性 $a_i$。子树的大小定义为其包含的结点数,子树的总重要性为其所有结点的重要性之和。对于非叶子结点,其重儿子定义为子树大小最大的儿子;若有多个,则选择编号最小的那个作为重儿子。 李华需要进行 $m$ 次操作: - “1 $x$” ($1\leq x\leq n$) —— 计算以 $x$ 为根的子树的重要性。 - “2 $x$” ($2\leq x\leq n$) —— 将 $x$ 的重儿子旋转到上方。具体来说,设 $son_x$ 为 $x$ 的重儿子,$fa_x$ 为 $x$ 的父亲。操作为删除 $x$ 与 $fa_x$ 之间的边,并连接 $son_x$ 与 $fa_x$。保证 $x$ 不是根结点,但不保证 $x$ 不是叶子结点。如果 $x$ 是叶子结点,则忽略该操作。 假如你是李华,请解决这个问题。

输入格式

第一行包含两个整数 $n,m$($2\le n\le 10^{5},1\le m\le 10^{5}$)——树的结点数和操作数。 第二行包含 $n$ 个整数 $a_{1},a_{2},\ldots ,a_{n}$($-10^{9}\le a_{i}\le 10^{9}$)——每个结点的重要性。 接下来 $n-1$ 行,每行包含两个整数 $u_i$ 和 $v_i$($1\le u_i,v_i\le n$,$u_i\ne v_i$)——表示一条树边。给定的边构成一棵树。 接下来 $m$ 行,每行一个操作。第 $j$ 行包含两个整数 $t_{j},x_{j}$($t_{j}\in \{1,2\}$,$1 \leq x_{j} \leq n$,若 $t_j = 2$,则 $x_{j}\neq 1$)——表示第 $j$ 次操作。

输出格式

对于每个“1 $x$”操作,输出一行答案。

说明/提示

在第一个样例中: 初始树如下图所示: ![](https://cdn.luogu.com.cn/upload/vjudge_pic/CF1797D/9987ad8dcf3fa22fea3d32776e957eb49f799b18.png) 结点 $6$ 的子树重要性为 $a_6+a_7=2$。 将结点 $3$ 的重儿子(即 $6$)旋转到上方后,树结构如下图所示: ![](https://cdn.luogu.com.cn/upload/vjudge_pic/CF1797D/d9aa4837f3bc9a3bc8a0cab55eb204e43f3ef9ba.png) 此时结点 $6$ 的子树重要性为 $a_6+a_3+a_7=3$。 结点 $2$ 的子树重要性为 $a_2+a_4+a_5=3$。 由 ChatGPT 4.1 翻译