记录编号 351389 评测结果 AAAATTTTTT
题目名称 新型武器 最终得分 40
用户昵称 GravatarTabing010102 是否通过 未通过
代码语言 C++ 运行时间 6.012 s
提交时间 2016-11-16 15:13:04 内存使用 4.88 MiB
显示代码纯文本
  1. #include <cstdio>
  2. #include <vector>
  3. using namespace std;
  4. const int maxn = 300000+10;
  5. FILE *fin, *fout;
  6. struct Node {
  7. int val;
  8. vector<int> sons;
  9. Node() { val=-1; sons.clear(); }
  10. }d[maxn];
  11. int n, q;
  12. void swap(int &a, int &b) { int t=a; a=b; b=t; }
  13. int _limit, _sum;
  14. void dfs(int now, int dep) {
  15. if(dep == _limit) {
  16. _sum += d[now].val;
  17. } else {
  18. for(int i = 0; i < d[now].sons.size(); i++)
  19. dfs(d[now].sons[i], dep+1);
  20. }
  21. }
  22. int main() {
  23. fin = fopen("newweapon.in", "r");
  24. fout = fopen("newweapon.out", "w");
  25. fscanf(fin, "%d", &n);
  26. for(int i = 1; i <= n; i++) fscanf(fin, "%d", &d[i].val);
  27. for(int i = 1; i <= n-1; i++) {
  28. int a, b;
  29. fscanf(fin, "%d%d", &a, &b);
  30. if(a > b) swap(a, b);
  31. d[a].sons.push_back(b);
  32. }
  33. fscanf(fin, "%d", &q);
  34. for(int i = 1; i <= q; i++) {
  35. int op, u, v;
  36. fscanf(fin, "%d%d%d", &op, &u, &v);
  37. if(op == 1) d[u].val = v;
  38. else {
  39. _limit = v; _sum = 0;
  40. dfs(u, 0);
  41. fprintf(fout, "%d\n", _sum);
  42. }
  43. }
  44. return 0;
  45. }