rt。
#include<bits/stdc++.h>
using namespace std;
const int mhd = 3e5 + 10;
int n,m,r,p,a[mhd],son[mhd],cnt,x,y,z,siz[mhd],dep[mhd],fat[mhd],mod,sum;
int fx[mhd],fy[mhd],fz[mhd];
int bx,by;
int head[mhd];
string op;
struct w1
{
int ad,l,r,ma,fg;
}c[mhd];
struct w
{
int to,nxt,z;
}b[mhd];
int xa[mhd],ba[mhd],bj[mhd];
int da[mhd];//点权
void biuld(int p,int l,int r)
{
c[p].l = l,c[p].r = r; c[p].fg = -1;
if(l == r)
{
c[p].ma = da[xa[l]];
return;
}
int mid = (l + r) / 2;
biuld(p * 2,l,mid); biuld(p * 2 + 1,mid + 1,r);
c[p].ma = max(c[p * 2].ma,c[p * 2 + 1].ma);
}
void lazy(int p)
{
c[p * 2].ad += c[p].ad; c[p * 2 + 1].ad += c[p].ad;
c[p * 2].ma += c[p].ad; c[p * 2 + 1].ma += c[p].ad;
c[p].ad = 0;
}
void lazy1(int p)
{
c[p * 2].fg = c[p * 2 + 1].fg = c[p].fg;
c[p * 2].ma = c[p * 2 + 1].ma = c[p].fg;
c[p * 2].ad = c[p * 2 + 1].ad = 0;
c[p].fg = -1;
}
void change(int p,int l,int r,int k,int pd)
{
if(l <= c[p].l && c[p].r <= r)
{
if(pd == 2)
{
c[p].ad += k;
c[p].ma += k;
}
else
{
c[p].fg = k; c[p].ad = 0;
c[p].ma = k;
}
return;
}
if(c[p].fg != -1) lazy1(p);
if(c[p].ad != 0) lazy(p);
int mid = (c[p].l + c[p].r) / 2;
if(l <= mid) change(p * 2,l,r,k,pd);
if(mid < r) change(p * 2 + 1,l,r,k,pd);
c[p].ma = max(c[p * 2].ma,c[p * 2 + 1].ma);
}
void ask(int p,int l,int r)
{
if(l <= c[p].l && c[p].r <= r)
{
sum = max(sum,c[p].ma);
return;
}
if(c[p].fg != -1) lazy1(p);
if(c[p].ad != 0) lazy(p);
int mid = (c[p].l + c[p].r) / 2;
if(l <= mid) ask(p * 2,l,r);
if(mid < r) ask(p * 2 + 1,l,r);
}
void add(int x,int y,int z)
{
b[++cnt].to = y;
b[cnt].nxt = head[x];
b[cnt].z = z;
head[x] = cnt;
}
void dfs(int x,int y,int fa)
{
siz[x] = 1,dep[x] = y; fat[x] = fa;
for(int i = head[x];i;i = b[i].nxt)
{
if(b[i].to != fa)
{
da[b[i].to] = b[i].z;
dfs(b[i].to,y + 1,x),siz[x] += siz[b[i].to];
if(siz[b[i].to] > siz[son[x]]) son[x] = b[i].to;
}
}
}
void dfs1(int x,int y,int fa)//重链,重新构造链
{
bj[x] = ++cnt;
xa[cnt] = x;//映射
ba[x] = y;
if(!son[x]) return;
dfs1(son[x],y,x);
for(int i = head[x];i;i = b[i].nxt)
if(b[i].to != fa && b[i].to != son[x])
dfs1(b[i].to,b[i].to,x);
}
void lca(int x,int y,int k,int zz)
{
while(ba[x] != ba[y])
{
if(dep[ba[x]] < dep[ba[y]]) swap(x,y);
change(1,bj[ba[x]],bj[x],k,zz);
x = fat[ba[x]];
}
if(dep[x] > dep[y]) swap(x,y);
change(1,bj[x] + 1,bj[y],k,zz);
}
void lca1(int x,int y)
{
while(ba[x] != ba[y])
{
if(dep[ba[x]] < dep[ba[y]]) swap(x,y);
ask(1,bj[ba[x]],bj[x]);
x = fat[ba[x]];
}
if(dep[x] > dep[y]) swap(x,y);
ask(1,bj[x] + 1,bj[y]);
}
int main()
{
scanf("%d",&n); r = 1;
for(int i = 1;i < n;i++)
{
scanf("%d%d%d",&x,&y,&z);
fx[i] = x,fy[i] = y,fz[i] = z;
add(x,y,z); add(y,x,z);
}
dfs(r,1,0);
cnt = 0;
dfs1(r,r,0);
biuld(1,1,n);
while(1)
{
cin >> op;
if(op == "Stop") return 0;
scanf("%d%d",&x,&y);
if(op == "Change") lca(fx[x],fy[x],y,1);
else if(op == "Cover")
{
scanf("%d",&z);
lca(x,y,z,1);
}
else if(op == "Add")
{
scanf("%d",&z);
lca(x,y,z,2);
}
else
{
sum = 0;
lca1(x,y);
printf("%d\n",sum);
}
}
return 0;
}