样例全过,求调
#include<bits/stdc++.h>
using namespace std;
#define ls(x) (x << 1)
#define rs(x) ((x << 1) | 1)
#define int long long
int n,q;
struct node{
int to;
int next;
int l;
}e[400005];
int cnt;
int head[200005];
int siz[200005],dep[200005];
int son[200005],father[200005];
int top[200005];
int tot;
int dfn[200005],id[200005];
int to[200005];
int val[200005];
struct segment{
int l,r;
int val;
}tree[1600005];
int lazy[1600005];
void pushup(int x){
tree[x].val = tree[ls(x)].val + tree[rs(x)].val;
}
void pushdown(int x){
if(lazy[x]){
lazy[ls(x)] = lazy[x];
lazy[rs(x)] = lazy[x];
tree[ls(x)].val = lazy[x];
tree[rs(x)].val = lazy[x];
lazy[x] = 0;
}
}
void build(int l,int r,int x){
tree[x].l = l;
tree[x].r = r;
lazy[x] = 0;
if(l == r){
tree[x].val = val[id[l]];
return ;
}
int mid = (l + r) / 2;
build(l,mid,ls(x));
build(mid+1,r,rs(x));
pushup(x);
}
void modify(int ql,int qr,int l,int r,int x,int k){
if(ql <= l && r <= qr){
tree[x].val = k;
lazy[x] = k;
return ;
}
pushdown(x);
int mid = (l + r) / 2;
if(ql <= mid) modify(ql,qr,l,mid,ls(x),k);
if(qr > mid) modify(ql,qr,mid+1,r,rs(x),k);
pushup(x);
}
int query1(int ql,int qr,int l,int r,int x){
if(ql <= l && r <= qr){
return tree[x].val;
}
pushdown(x);
int ans = 0;
int mid = (l + r) / 2;
if(ql <= mid) ans += query1(ql,qr,l,mid,ls(x));
if(qr > mid) ans += query1(ql,qr,mid+1,r,rs(x));
return ans;
}
int query2(int u,int v){
int ans = 0;
while(top[u] != top[v]){
if(dep[top[u]] < dep[top[v]]) swap(u,v);
ans += query1(dfn[top[u]],dfn[u],1,n,1);
u = father[top[u]];
}
if(dep[u] < dep[v]) swap(u,v);
ans += query1(dfn[v]+1,dfn[u],1,n,1);
return ans;
}
void add(int u,int v,int l){
e[++ cnt].to = v;
e[cnt].next = head[u];
e[cnt].l = l;
head[u] = cnt;
}
void dfs1(int u,int fa){
siz[u] = 1;
father[u] = fa;
dep[u] = dep[fa] + 1;
for(int i=head[u];i;i=e[i].next){
int v = e[i].to;
if(v == fa) continue;
dfs1(v,u);
val[v] = e[i].l;
siz[v] += siz[u];
if(siz[son[u]] < siz[v]) son[u] = v;
}
}
void dfs2(int u,int ntop){
top[u] = ntop;
dfn[u] = ++ tot;
id[tot] = u;
if(son[u]) dfs2(son[u],ntop);
for(int i=head[u];i;i=e[i].next){
int v = e[i].to;
if(v == son[u] || v == father[u]) continue;
dfs2(v,v);
}
}
signed main(){
cin >> n;
for(int i=1;i<n;i++){
int u,v,l;
cin >> u >> v >> l;
add(u,v,l);
add(v,u,l);
to[i] = v;
}
dfs1(1,0);
dfs2(1,1);
build(1,n,1);
cin >> q;
while(q --){
int op;
int u,v;
cin >> op >> u >> v;
if(op == 1) modify(dfn[to[u]],dfn[to[u]],1,n,1,v);
else cout << query2(u,v) << endl;
}
return 0;
}