题目描述
给定一棵以 号结点为根的树,结点编号为 ,第 个结点有一个非负整数点权 。
一个结点 的子树,指的是 本身以及它的所有后代结点组成的集合。
现在有 次询问,每次询问给出一个操作类型 和一个结点 :
- 若 ,求 的子树内包含的结点个数;
- 若 ,求 的子树内所有结点的点权之和。
输入格式
第一行一个正整数 ,表示树的结点数。
第二行 个非负整数 ,依次表示每个结点的点权。
接下来 行,每行两个正整数 ,表示结点 与结点 之间有一条边;当 时没有边。保证这些边构成一棵以 号结点为根的树。
接下来一行一个正整数 ,表示询问次数。
接下来 行,每行两个整数 ,表示一次询问,其中 ,。
输出格式
共 行,每行一个整数,依次表示每次询问的答案。
样例
输入:
6
2 5 1 4 3 6
1 2
1 3
2 4
2 5
3 6
5
1 1
2 2
1 3
2 4
2 1
输出:
6
12
2
4
21
样例说明:
以 为根时,各结点的子树如下:
- 结点 的子树包含全部 个结点,权值和为 ;
- 结点 的子树为 ,共 个结点,权值和为 ;
- 结点 的子树为 ,共 个结点,权值和为 ;
- 结点 的子树只有 ,权值和为 。
因此前四次询问的答案依次为 ,最后一次询问结点 的权值和为 。
数据范围
- ,;
- ;
- ,保证输入的 条边构成一棵树;
- 子树权值和可能超过 位整数范围,请使用 位整数(C++ 中的
long long)保存答案。