思路:
emmm
正解好像是啥树状数组
反正我不会
然后aj也说80分就够了
就打了个80分的暴搜
有2种操作:
操作(a).“1 x val”表示给节点x的权值加val。
操作(b).“2 x”输出节点x当前的权值。
我们模拟这两种操作去做dfs就好
C o d e Code Code:
#include<iostream>
#include<cstdio>
using namespace std;
int a[100000],n,m,x,z,now[100000],y;
struct node
{
int w,p;
}e[1000005];
void dfs(int dep,int g)
{
a[dep] += g;
for(int i = now[dep]; i ; i = e[i].p)//搜相邻的边
dfs(e[i].w, -g);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i = 1; i <= n; i++)
scanf("%d",&a[i]);
for(int i = 1; i < n; i++)
{
scanf("%d%d",&x,&y);
e[i] = node{
y,now[x]}; now[x]=i;//邻接表建树
}
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
if(x == 2)//操作2
{
printf("%d\n",a[y]);
continue;
}
scanf("%d",&z);
dfs(y,z);//dfs
}
}