正题
大意
给出一个树,每个节点都有值。如果一个节点加上val,那么他的子节点就得加上-val以此类推。有两种操作:
(1)询问一个节点的值
(2)一个节点的值加上一个数
解题思路
改变就计算到一个其他数组里,然后每次询问就回到根节点,一路把标记顺下来。
代码
#include<cstdio>
#include<cctype>
using namespace std;
int n,m,xx,yy,w[100001],lazy[100001],ques,ls[100001],father[100001],ans;
char c;
int in()
{ans=0;c=getchar();if (!isdigit(c)) c=getchar();//ans=c-48;while (isdigit(c)){ans=ans*10+c-48;c=getchar();}return ans;
}
int updata(int k,int mov)
{if (!k) return 0;return updata(father[k],-mov)+lazy[k]*mov;//回退计算
}
int main()
{freopen("tree.in","r",stdin);freopen("tree.out","w",stdout);n=in();m=in();for (int i=1;i<=n;i++){w[i]=in();}for (int i=1;i<n;i++){xx=in();yy=in();father[yy]=xx;}for (int i=1;i<=m;i++){scanf("%d",&ques);if (ques==2){xx=in();printf("%d\n",w[xx]+updata(xx,1));}else{xx=in();yy=in();lazy[xx]+=yy;}}
}