题目大意:
解题思路:
有三种 ——
类似线段树的树
线段树
树状数组
我用了第一种
用lazy保存改变的值,然后每次进行2操作时就找到根节点,然后一直递归出改变值的总值,加上本来的权值
源程序:
#include<cstdio>
using namespace std;
int xx,yy,a,x,val,n,m,b[100001],father[100001],lazy[100001];
int op(int u,int v)
{
if (!u) return 0;
return lazy[u]*v+op(father[u],-v);
}
int main()
{
freopen("tree.in","r",stdin);
freopen("tree.out","w",stdout);
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
scanf("%d",&b[i]);
for (int i=1;i<n;i++)
scanf("%d%d",&xx,&yy),father[yy]=xx;
for (int i=1;i<=m;i++)
{
scanf("%d%d",&a,&x);
if (a==1)
{
scanf("%d",&val);
lazy[x]+=val;
}
else
printf("%d\n",b[x]+op(x,1));
}
}