| 记录编号 | 351389 | 评测结果 | AAAATTTTTT | 
    
        | 题目名称 | 2551.新型武器 | 最终得分 | 40 | 
    
        | 用户昵称 |  Tabing010102 | 是否通过 | 未通过 | 
    
        | 代码语言 | C++ | 运行时间 | 6.012 s | 
    
        | 提交时间 | 2016-11-16 15:13:04 | 内存使用 | 4.88 MiB | 
    
    
    
    		显示代码纯文本
		
		#include <cstdio>
#include <vector>
using namespace std;
const int maxn = 300000+10;
FILE *fin, *fout;
struct Node {
	int val;
	vector<int> sons;
	Node() { val=-1; sons.clear(); }
}d[maxn];
int n, q;
void swap(int &a, int &b) { int t=a; a=b; b=t; }
int _limit, _sum;
void dfs(int now, int dep) {
	if(dep == _limit) {
		_sum += d[now].val;
	} else {
		for(int i = 0; i < d[now].sons.size(); i++)
			dfs(d[now].sons[i], dep+1);
	}
}
int main() {
	fin = fopen("newweapon.in", "r");
	fout = fopen("newweapon.out", "w");
	fscanf(fin, "%d", &n);
	for(int i = 1; i <= n; i++) fscanf(fin, "%d", &d[i].val);
	for(int i = 1; i <= n-1; i++) {
		int a, b;
		fscanf(fin, "%d%d", &a, &b);
		if(a > b) swap(a, b);
		d[a].sons.push_back(b);
	}
	fscanf(fin, "%d", &q);
	for(int i = 1; i <= q; i++) {
		int op, u, v;
		fscanf(fin, "%d%d%d", &op, &u, &v);
		if(op == 1) d[u].val = v;
		else {
			_limit = v; _sum = 0;
			dfs(u, 0);
			fprintf(fout, "%d\n", _sum);
		}
	}
	return 0;
}