1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| #include <bits/stdc++.h> using namespace std; int n,ca; int head[100005],tot; struct EDGE{ int nex,to; } e[200005]; void add(int u,int v){ e[++tot].nex=head[u]; e[tot].to=v; head[u]=tot; } int cnt,ans1,de[100005],id[100005];
vector<int> sum[100005]; void dfs(int u,int fa,int idd){ sum[idd].push_back(0); de[u]=de[fa]+1; id[u]=idd; for(int i=head[u];i;i=e[i].nex){ int v=e[i].to; if(v==fa) continue; dfs(v,u,idd); } }
int query(int x,int id){ int tmp=0; while(x){ tmp+=sum[id][x]; x-=(x&(-x)); } return tmp; } void update(int x,int k,int id){ while(x<sum[id].size()){ sum[id][x]+=k; x+=(x&(-x)); } } void change(int l,int r,int k,int id){ update(l,k,id),update(r+1,-k,id); } int main(){ scanf("%d%d",&n,&ca); for(int i=1,u,v;i<n;i++){ scanf("%d%d",&u,&v); add(u,v),add(v,u); } for(int i=head[1];i;i=e[i].nex){ dfs(e[i].to,1,++cnt); } for(int i=1;i<=n;i++){ sum[0].push_back(0); } for(int i=0;i<=cnt;i++){ sum[i].push_back(0); } while(ca--){ int op,v,x,d; scanf("%d%d",&op,&v); if(op==1){ if(v==1){ printf("%d\n",ans1); } else{ printf("%d\n",query(de[v],0)+query(de[v],id[v])); } } else{ scanf("%d%d",&x,&d); if(v==1){ change(1,min(d,n),x,0); ans1+=x; continue; } int tmp=min(n,d-de[v]); int l=max(tmp+1,max(0,de[v]-d)); int r=min((int)sum[id[v]].size()-1,de[v]+d); if(l<=r) change(l,r,x,id[v]); if(tmp>0) change(1,tmp,x,0); if(tmp>=0) ans1+=x; } } return 0; }
|