现在知道是树链的板子,但好奇我wa的是为什么错,感谢orz
#include<iostream>
#define maxn 1000000
using namespace std;
long long head[maxn],nex[maxn],to[maxn],ans[maxn];
long long head1[maxn],to1[maxn];
long long g[maxn];
long long tot=0ll,top=0ll,sum=0ll,tot1=0ll;
void add(long long x,long long y)
{
to[++tot]=y;
nex[tot]=head[x];
head[x]=tot;
}
void add1(long long x,long long y)
{
to1[++tot1]=y;
head1[x]=tot1;
}
void op1(long long x,long long a)
{
g[x]+=a;
}
void op2(long long x,long long a)
{
g[x]+=a;
for(long long i=head[x];i;i=nex[i])
op2(to[i],a);
}
void op3(long long x)
{
sum+=g[x];
if(to1[head1[x]]!=0)
op3(to1[head1[x]]);
}
int main()
{
long long n,m;
cin>>n>>m;
for(long long i=1;i<=n;i++)
cin>>g[i];
for(long long i=1,x,y;i<n;i++)
{
cin>>x>>y;
add(x,y);
add1(y,x);
}
for(long long i=1;i<=m;i++)
{
long long a1,a2,a3;
cin>>a1;
if(a1==1)
{
cin>>a2>>a3;
op1(a2,a3);
}
if(a1==2)
{
cin>>a2>>a3;
op2(a2,a3);
}
if(a1==3)
{
cin>>a2;
op3(a2);
ans[++top]=sum;
sum=0;
}
}
for(int i=1;i<top;i++)
cout<<ans[i]<<endl;
cout<<ans[top];
return 0;
}