1 solutions
-
0
#include <bits/stdc++.h> #define int long long using namespace std; struct str{ int l,r,v,add; }tr[400005]; int a[100005]; int b[100005]; int d[100005]; int son[100005]; int father[100005]; int sz[100005]; int in[100005]; int top[100005]; int tot; vector<int>g[100005]; void pushup(int p) { tr[p].v=tr[p<<1].v+tr[p<<1|1].v; } void pushdown(int p) { int mid=(tr[p].l+tr[p].r)>>1; if(tr[p].add!=0) { tr[p<<1].v+=tr[p].add*(mid-tr[p].l+1); tr[p<<1|1].v+=tr[p].add*(tr[p].r-mid); tr[p<<1].add+=tr[p].add; tr[p<<1|1].add+=tr[p].add; tr[p].add=0; } } void build(int p,int x,int y) { tr[p].l=x; tr[p].r=y; if(x==y) { tr[p].v=b[x]; return; } int mid=(x+y)>>1; build(p<<1,x,mid); build(p<<1|1,mid+1,y); pushup(p); } void update(int p,int x,int y,int v) { if(x<=tr[p].l&&tr[p].r<=y) { tr[p].v+=v*(tr[p].r-tr[p].l+1); tr[p].add+=v; return; } pushdown(p); int mid=(tr[p].l+tr[p].r)>>1; if(x<=mid){ update(p<<1,x,y,v); } if(y>mid){ update(p<<1|1,x,y,v); } pushup(p); } int query(int p,int x,int y) { if(x<=tr[p].l&&tr[p].r<=y){ return tr[p].v; } pushdown(p); int mid=(tr[p].l+tr[p].r)>>1; int ans=0; if (x<=mid){ ans+=query(p<<1,x,y); } if(y>mid){ ans+=query(p<<1|1,x,y); } return ans; } void dfs1(int u,int f){ father[u]=f; d[u]=d[f]+1; sz[u]=1; for(int i:g[u]){ if(i==f){ continue; } dfs1(i,u); sz[u]+=sz[i]; if(sz[i]>sz[son[u]]){ son[u]=i; } } } void dfs2(int u,int t){ tot++; in[u]=tot; top[u]=t; if(!son[u]){ return; } dfs2(son[u],t); for(int i:g[u]){ if(i==son[u]||i==father[u]){ continue; } dfs2(i,i); } } int decquery(int x,int y){ int ans=0; while(top[x]!=top[y]){ if(d[top[x]]<d[top[y]]){ swap(x,y); } ans+=query(1,in[top[x]],in[x]); x=father[top[x]]; } if(d[x]<d[y]){ swap(x,y); } ans+=query(1,in[y],in[x]); return ans; } void decupdate_subtree(int x,int k){ update(1,in[x],in[x]+sz[x]-1,k); } signed main(){ ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); int n,m; cin>>n>>m; for(int i=1;i<=n;i++){ cin>>a[i]; } for(int i=1;i<n;i++){ int u,v; cin>>u>>v; g[u].push_back(v); g[v].push_back(u); } dfs1(1,0); dfs2(1,0); for(int i=1;i<=n;i++){ b[in[i]]=a[i]; } build(1,1,n); for(int i=1;i<=m;i++){ int f; cin>>f; if(f==1){ int x,a; cin>>x>>a; update(1,in[x],in[x],a); } if(f==2){ int x,a; cin>>x>>a; decupdate_subtree(x,a); } if(f==3){ int x; cin>>x; cout<<decquery(1,x)<<"\n"; } } }
- 1
Information
- ID
- 324
- Time
- 1000ms
- Memory
- 125MiB
- Difficulty
- 10
- Tags
- # Submissions
- 7
- Accepted
- 4
- Uploaded By