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;
}

posted @ 2018-11-19 18:00  Dzzzzzz  阅读(221)  评论(0编辑  收藏  举报