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
| #include<bits/stdc++.h> #define ls o<<1 #define rs o<<1|1 using namespace std; using ll=long long; const int N=2e5+5; int n,a[N],dfn[N],id[N],sz[N],tot; int dep[N],fa[N][30]; ll dis[N]; vector<pair<int,int>> g[N]; void dfs(int u,int pre){ dfn[u]=++tot,sz[u]=1; id[tot]=u; fa[u][0]=pre;dep[u]=dep[pre]+1; for(int i=1;i<=20;i++) fa[u][i]=fa[fa[u][i-1]][i-1]; for(auto [v,w]:g[u]){ if(v==pre) continue; dis[v]=dis[u]+w; dfs(v,u); sz[u]+=sz[v]; } }
int lca(int u,int v){ if(dep[u]<dep[v]) swap(u,v); for(int i=20;i>=0;i--) if(dep[fa[u][i]]>=dep[v]) u=fa[u][i]; if(u==v) return u; for(int i=20;i>=0;i--) if(fa[u][i]!=fa[v][i]) u=fa[u][i],v=fa[v][i]; return fa[u][0]; }
struct edge{ int u,v; ll w; }e[N]; void solve(){ cin>>n; for(int i=1;i<=n;i++) g[i].clear(); for(int i=1;i<n;i++){ int u,v,w; cin>>u>>v>>w; g[u].push_back({v,w}); g[v].push_back({u,w}); e[i]={u,v,w}; } tot=0,dfs(1,0); build(1,1,tot); int q,op,x,y; cin>>q; while(q--){ cin>>op>>x>>y; if(op==1){ auto [u,v,w]=e[x]; if(dep[u]<dep[v]) swap(u,v); update(1,1,tot,dfn[u],dfn[u]+sz[u]-1,y-w); e[x].w=y; } else{ int d=lca(x,y); cout<<query(1,1,tot,dfn[x],dfn[x])+query(1,1,tot,dfn[y],dfn[y])-2*query(1,1,tot,dfn[d],dfn[d])<<'\n'; } } } int main(){ ios::sync_with_stdio(0);cin.tie(0); int T=1; while(T--) solve(); return 0; }
|