题目链接:http://129.211.20.246/problem.php?id=1009
思路:DFS序先处理,然后树状数组维护。
#include<algorithm>
#include<string.h>
#include<stdio.h>
#include<vector>
#define ll long long
using namespace std;
const ll Max=1e6+5;
ll A[Max],fi[Max],la[Max],tot=0,b[Max],T[4*Max];
vector<ll>v[Max];
ll dfs(ll r)
{
b[r]=1;
fi[r]=++tot;
for(ll i=0;i<v[r].size();i++)
{
ll u=v[r][i];
if(!b[u])
{
dfs(u);
++tot;
}
}
la[r]=tot;
return 0;
}
ll lowbit(ll x)
{
return x&(-x);
}
ll add(ll x,ll k)
{
while(x<4*Max)
{
T[x]+=k;
x+=lowbit(x);
}
return 0;
}
ll re(ll x)
{
ll ans=0;
while(x>0)
{
ans+=T[x];
x-=lowbit(x);
}
return ans;
}
int main()
{
// add(1,8);
// printf("%d\n",re(1));
ll n,m,r,x,y;
scanf("%lld%lld%lld",&n,&m,&r);
for(ll i=1;i<=n;i++)
scanf("%lld",&A[i]);
for(ll i=1;i<n;i++)
{
scanf("%lld%lld",&x,&y);
v[x].push_back(y);
v[y].push_back(x);
}
dfs(r);
for(ll i=1;i<=n;i++)
add(fi[i],A[i]);
for(ll i=1;i<=m;i++)
{
scanf("%lld",&x);
if(x==1)
{
scanf("%lld%lld",&x,&y);
add(fi[x],y);
}
else
{
scanf("%lld",&y);
printf("%lld\n",re(la[y])-re(fi[y]-1));
}
}
return 0;
}