#include<cstdio>
#include<cstring>
#include<iostream>
#define lc k<<1
#define rc k<<1|1
#define IN inline
#define R register
using namespace std;
const int N=1e4+10;
IN int read(){
R int x=0;R bool f=1;
R char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=0;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return f?x:-x;
}
struct node{
int u,v,w,next;
}e[N<<1];
int n,T,tot,num,head[N],fa[N],top[N],pos[N],dep[N],siz[N],son[N];
int a[N<<2];
void add(int x,int y,int z){
e[++tot].u=x;
e[tot].v=y;
e[tot].w=z;
e[tot].next=head[x];
head[x]=tot;
}
void dfs(int u,int f,int de){
fa[u]=f;dep[u]=de;siz[u]=1;
for(int i=head[u],v;i;i=e[i].next){
v=e[i].v;
if(v!=f){
dfs(v,u,de+1);
siz[u]+=siz[v];
if(!son[u]||siz[son[u]]<siz[v]){
son[u]=v;
}
}
}
}
void getpos(int u,int tp){
top[u]=tp;
pos[u]=++num;
if(!son[u]) return ;
getpos(son[u],tp);
for(int i=head[u],v;i;i=e[i].next){
v=e[i].v;
if(v!=son[u]&&v!=fa[u]){
getpos(v,v);
}
}
}
void change(int k,int l,int r,int pos,int val){
if(l==r){
a[k]=val;
return;
}
int mid=l+r>>1;
if(pos<=mid) change(lc,l,mid,pos,val);
else change(rc,mid+1,r,pos,val);
a[k]=max(a[lc],a[rc]);
}
int query(int k,int l,int r,int x,int y){
if(l==x&&y==r) return a[k];
int mid=l+r>>1;
if(y<=mid) return query(lc,l,mid,x,y);
else if(x>mid) return query(rc,mid+1,r,x,y);
else return max(query(lc,l,mid,x,mid),query(rc,mid+1,r,mid+1,y));
}
int find(int u,int v){
int tp1=top[u],tp2=top[v],ans=0;
while(tp1!=tp2){
if(dep[tp1]<dep[tp2]){
swap(tp1,tp2);
swap(u,v);
}
ans=max(ans,query(1,1,num,pos[tp1],pos[u]));
u=fa[tp1];tp1=top[u];
}
if(u==v) return ans;
if(dep[u]>dep[v]) swap(u,v);
return max(ans,query(1,1,num,pos[u]+1,pos[v]));
}
void Cl(){
tot=0;num=0;
memset(a,0,sizeof a);
memset(fa,0,sizeof fa);
memset(head,0,sizeof head);
memset(pos,0,sizeof pos);
memset(top,0,sizeof top);
memset(son,0,sizeof son);
memset(dep,0,sizeof dep);
}
int main(){
for(T=read();T--;){
Cl();
n=read();
for(int i=1,x,y,z;i<n;i++){
x=read();y=read();z=read();
add(x,y,z);add(y,x,z);
}
dfs(1,0,1);
getpos(1,1);
for(int i=1,t=(n-1)*2;i<t;i+=2){
if(dep[e[i].v]<dep[e[i].u]) swap(e[i].u,e[i].v);
change(1,1,num,pos[e[i].v],e[i].w);
}
char ch[20];
for(int x,y;;){
scanf("%s",ch);
if(ch[0]=='D') break;
if(ch[0]=='C'){
x=read();y=read();
change(1,1,num,pos[e[x*2-1].v],y);
}
else{
x=read();y=read();
printf("%d\n",find(x,y));
}
}
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术