#878. DFS序与子树和2

DFS序与子树和2

题目描述

DFS序+全子树修改+子树和查询(区间修改+区间和查询) 给一棵有根树,这棵树由编号为1 ... N的N个结点组成。根结点的编号为R。每个结点都有一个权值,结点i的权值为vi。 接下来有M组操作,操作分为两类: · 1 a x, 表示将结点a的子树上所有结点的权值增加x; · 2 a, 表示求结点a的子树上所有结点的权值之和。

输入格式

第一行有三个整数N,M和R。 第二行有N个整数,第i个整数表示vi。 在接下来的N-1行中,每行两个整数,表示一条边。 在接下来的M行中,每行一组操作。

输出格式

对于每组 2 a 操作,输出一个整数,表示「以结点α为根的子树」上所有结点的权值之和。

样例

输入样例 1

10 14 9
12 -6 -4 -3 12 8 9 6 6 2
8 2
2 10
8 6
2 7
7 1
6 3
10 9
2 4
10 5
1 4 -1
2 2
1 7 -1
2 10
1 10 5
2 1
1 7 -5
2 5
1 1 8
2 7
1 8 8
2 2
1 5 5
2 6

输出样例 1

21
33
16
17
27
76
30

输入样例 2

2 5 1
1 -2
1 2
2 1
1 1 20
2 1
1 2 -3
2 1

输出样例 2

-1
39
36

输入样例 3

5 6 1
1 9 3 2 4
1 2
2 4
4 5
2 3
1 2 10
2 3
2 1
1 5 2
2 2
2 4

输出样例 3

13
59
60
28

提示

数据范围:2<=N<=10^5;1<=a,R<=N;-100<=x,vi<=100。

思路:用DFS序把树型结构问题转化为线性区间问题(子树对应连续的DFS区间) 通过「线段树」实现区间修改+区间和查询 1、生成DFS序和in、out时间数组 2、以 dfs序 的时间戳作为索引来维护一棵线段树 依然按照入栈时间 in 和出栈时间 out 作为索引 3、然后套上区间修改和区间求和的线段树即可