rt,c++版能过,c本地没问题,交上去TLE
#include<stdio.h>
#define mems(x,y) memset(x,y,sizeof x)
typedef long long ll;
#define N 100007
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
#define swap(a,b) a^=b^=a^=b;
int inf=0x3f3f3f3f;
int n,id[N],c[N];
int fa[N],dep[N],siz[N],wt[N];
int cnt,dfn[N],top[N],rk[N];
int tr[N<<2];
char str[7];
int tot=1,head[N];
struct node{
int to,nxt,cw;
}e[N<<1];
inline void add(int u,int v,int w){
tot++;
e[tot].to=v;
e[tot].nxt=head[u];
e[tot].cw=w;
head[u]=tot;
}
void dfs1(int u,int f){
fa[u]=f;
dep[u]=dep[f]+1;
siz[u]=1;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(v==f){
continue;
}
c[v]=e[i].cw;
id[i>>1]=v;
dfs1(v,u);
siz[u]+=siz[v];
if(siz[v]>siz[wt[u]]){
wt[u]=v;
}
}
}
void dfs2(int u,int t){
top[u]=t;
dfn[u]=++cnt;
rk[cnt]=u;
if(wt[u]==0){
return;
}
dfs2(wt[u],t);
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(v==fa[u]||v==wt[u]){
continue;
}
dfs2(v,v);
}
}
inline void pushup(int o){
tr[o]=max(tr[o<<1],tr[o<<1|1]);
}
void build(int l,int r,int o){
if(l==r){
tr[o]=c[rk[l]];
return;
}
int mid=(l+r)>>1;
build(l,mid,o<<1);
build(mid+1,r,o<<1|1);
pushup(o);
}
void update(int l,int r,int o,int x,int y){
if(l==r){
tr[o]=y;
return;
}
int mid=(l+r)>>1;
if(x<=mid){
update(l,mid,o<<1,x,y);
}else{
update(mid+1,r,o<<1|1,x,y);
}
pushup(o);
}
int query(int l,int r,int o,int x,int y){
if(l>=x&&r<=y){
return tr[o];
}
int mid=(l+r)>>1,ret=0;
if(x<=mid){
ret=max(ret,query(l,mid,o<<1,x,y));
}
if(y>mid){
ret=max(ret,query(mid+1,r,o<<1|1,x,y));
}
return ret;
}
int ask(int u,int v){
int ret=0;
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]]){
swap(u,v);
}
ret=max(ret,query(1,n,1,dfn[top[u]],dfn[u]));
u=fa[top[u]];
}
if(dfn[u]>dfn[v]){
swap(u,v);
}
// printf("%d %d\n",c[v],dfn[v]);
if(u!=v){
ret=max(ret,query(1,n,1,dfn[u]+1,dfn[v]));
}
return ret;
}
void solve(){
scanf("%d",&n);
tot=1;
cnt=0;
for(int i=1;i<=n;i++){
head[i]=0;
wt[i]=0;
}
for(int i=1,u,v,w;i<n;i++){
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
add(v,u,w);
}
dep[1]=0;
dfs1(1,0);
dfs2(1,0);
build(1,n,1);
while(scanf("%s",str)){
if(str[0]=='D'){
break;
}
int x,y;
scanf("%d%d",&x,&y);
if(str[0]=='C'){
update(1,n,1,dfn[id[x]],y);
}else{
printf("%d\n",ask(x,y));
}
}
}
signed main(){
int t=1;
scanf("%d",&t);
while(t--)solve();
}