/*
【dfs序】【树状数组】【牛客竞赛】【求和】
点修改+区间 查询
dfs序+树状数组
*/
#include<iostream>
#include<vector>
#define ll long long
using namespace std;
const int maxn=1e6+10;
ll n,m,k;
ll val[maxn],c[maxn];
vector<ll> nums[maxn];
ll lowbit(ll x)
{return x&(-x);}
void updata(ll ins,ll x)
{
while(ins<=n)
{
c[ins]+=x;
ins+=lowbit(ins);
}
return ;
}
ll query(ll ins)//返回的是1~ins的区间之和
{
ll sum=0;
while(ins)
{
sum+=c[ins];
ins-=lowbit(ins);
}
return sum;
}//以上是树状数组
ll datatime=0;
ll in[maxn],out[maxn];
void dfs(int g,int u)//根节点 dfs序 映射
{
in[g]=++datatime;
updata(datatime,val[g]);
for(int i=0;i<nums[g].size();i++)
{
ll v=nums[g][i];
if(v!=u)
dfs(v,g);
}
out[g]=datatime;
}
int main()
{
scanf("%lld%lld%lld",&n,&m,&k);
for(int i=1;i<=n;i++)
scanf("%lld",&val[i]);
ll v,u;
for(int i=1;i<n;i++)
{
scanf("%lld%lld",&u,&v);
nums[u].push_back(v);
nums[v].push_back(u);
}
dfs(k,0);
ll f;
while(m--)
{
scanf("%lld%lld",&f,&u);
if(f==1)
{
scanf("%lld",&v);
updata(in[u],v);
}
else
{
printf("%lld\n",query(out[u])-query(in[u]-1));
}
}
}
【dfs序】【树状数组】【牛客竞赛】【求和】
最新推荐文章于 2024-05-30 20:15:33 发布