DFS 序 1 (Loj#144)
又到了快乐的板子题时间了!!!QwQ
显然这道题用线段树是可以做的 ,
但是蒟蒻的我还是想用树状数组写(好吧还是因为太懒了)
所以就变成了一个树状数组的单点修改+区间查询+跑一个DFS的题目
代码如下
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#define LL long long
using namespace std;
const int maxn=1e6+5;
int n,m,R,x,y;
LL c[maxn],a[maxn],r[maxn],l[maxn];
LL ans=0;
vector<int>g[maxn];
int lowbit(int x){
return x&(-x);
}
void update(int x,int v){
for(int i=x;i<=n;i+=lowbit(i)){
c[i]+=v;
}
}
LL query(int x){
LL ans=0;
for(int i=x;i>0;i-=lowbit(i)){
ans+=c[i];
}
return ans;
}
void dfs(int u,int fa){
l[u]=++ans;
update(ans,a[u]);
for(int i=0;i<g[u].size();i++){
int x=g[u][i];
if(x==fa)continue;
dfs(x,u);
}
r[u]=ans;
}
int main(){
scanf("%d%d%d",&n,&m,&R);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
for(int i=1;i<n;i++){
int u,v;scanf("%d%d",&u,&v);
g[u].push_back(v);
g[v].push_back(u);
}
dfs(R,0);
for(int i=1;i<=m;i++){
int x,y,z;scanf("%d",&x);
if(x==1){
scanf("%d%d",&y,&z);
update(l[y],z);
}
else{
scanf("%d",&y);
ans=query(r[y])-query(l[y]-1);
printf("%lld\n",ans);
}
}
return 0;
}