比赛 20161116 评测结果 AAAATTTTTT
题目名称 新型武器 最终得分 40
用户昵称 Tabing010102 运行时间 6.020 s
代码语言 C++ 内存使用 4.88 MiB
提交时间 2016-11-16 11:10:15
显示代码纯文本
#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;
}