分析:
对于改变,用一个数组记录改变值,求值时,从当前点往根节点走,遇到一个点看该点到求值的点的距离的奇偶,对应加减即可,距离可以每上一层就加1,要先预处理出每个点的父亲即可。
代码:
var
n,m,i,x,y,s,j,d:longint;
f,t,w,b,e:array[1..100000] of longint;
v:array[1..100000] of boolean;
a:array[0..200000,1..2] of longint;
procedure qsort(l,r:longint);
var
i,j,k:longint;
begin
if l>=r then exit;
i:=l;
j:=r;
k:=a[(i+j) div 2,1];
repeat
while a[i,1]<k do inc(i);
while a[j,1]>k do dec(j);
if i<=j then
begin
a[0]:=a[i];a[i]:=a[j];a[j]:=a[0];
inc(i);dec(j);
end;
until i>j;
qsort(i,r);
qsort(l,j);
end;
procedure dfs(x:longint);
var
i:longint;
begin
v[x]:=false;
for i:=b[x] to e[x] do
if v[a[i,2]] then
begin
f[a[i,2]]:=x;
dfs(a[i,2]);
end;
end;
begin
readln(n,m);
for i:=1 to n do
read(w[i]);
readln;
for i:=1 to n-1 do
begin
readln(x,y);
a[i*2-1,1]:=x;
a[i*2-1,2]:=y;
a[i*2,1]:=y;
a[i*2,2]:=x;
end;
qsort(1,n*2-2);
a[0,1]:=0;
for i:=1 to n*2-2 do
begin
if a[i,1]<>a[i-1,1] then b[a[i,1]]:=i;
if a[i,1]<>a[i+1,1] then e[a[i,1]]:=i;
end;
fillchar(v,sizeof(v),true);
dfs(1);
for i:=1 to m do
begin
read(x);
if x=1
then begin
readln(x,y);
t[x]:=t[x]+y;
end
else begin
readln(x);
s:=w[x];
j:=x;
d:=0;
while j>0 do
begin
d:=1-d;
if d=0
then s:=s-t[j]
else s:=s+t[j];
j:=f[j];
end;
writeln(s);
end;
end;
end.