RT,
// created time : 2021-12-28 12:12:41
// writer : fjy
#include <bits/stdc++.h>
#define _rep(i_,a_,b_) for(int i_ = a_;i_ <= b_;++i_)
int in(void) { int x; scanf("%d",&x); return x; }
typedef long long ll;
using namespace std;
const int kN = 100005;
vector<pair<int,int> > g[kN];
int mx[kN << 2],n,fa[kN],top[kN],dfn[kN],siz[kN],son[kN],dep[kN],v[kN],dfs_clock;
void assign(int p,int d,int x = 1,int L = 1,int R = n) {
if(L == R) mx[x] = d;
else {
if(p <= (L+R) / 2) assign(p,d,x<<1,L,(L+R) / 2);
else assign(p,d,x<<1|1,(L+R) / 2 + 1,R);
mx[x] = max(mx[x<<1],mx[x<<1|1]);
}
}
int query(int l,int r,int x = 1,int L = 1,int R = n) {
if(l > r || l < 1 || r > n) return 0;
if(l <= L && R <= r) return mx[x]; int ans = 0;
if(l <= (L+R) / 2) ans = max(ans,query(l,r,x<<1,L,(L+R) / 2));
if((L + R) / 2 < r) ans = max(ans,query(l,r,x<<1|1,(L+R) / 2 + 1,R));
return ans;
}
void dfs1(int u,int f) {
fa[u] = f,dep[u] = dep[f] + 1,siz[u] = 1; int mx = 0;
for(pair<int,int> &edge : g[u]) if(edge.first != f) {
v[edge.first] = edge.second; dfs1(edge.first,u);
siz[u] += siz[edge.first]; if(siz[edge.first] > mx) mx = siz[edge.first],son[u] = edge.first;
}
}
void dfs2(int u,int t) {
top[u] = t,dfn[u] = ++dfs_clock; assign(dfs_clock,v[u]); if(!son[u]) return; dfs2(son[u],t);
for(pair<int,int> &edge : g[u]) if(edge.first != son[u] && edge.first != fa[u]) dfs2(edge.first,edge.first);
}
int QUERY(int a,int b) {
int ans = 0;
while(top[a] != top[b]) {
if(dep[top[a]] < dep[top[b]]) swap(a,b);
ans = max(ans,query(dfn[top[a]],dfn[a]));
a = fa[top[a]];
}
if(dfn[a] > dfn[b]) swap(a,b); ans = max(ans,query(dfn[a] + 1,dfn[b]));
return ans;
}
pair<int,int> edges[kN];
int MODIFY(int i,int t) {
int a = edges[i].first,b = edges[i].second;
dep[a] > dep[b] ? assign(dfn[a],t) : assign(dfn[b],t);
}
int main() {
int t = in();
while(t--) {
n = in();
_rep(i,0,kN - 1) g[i].clear();
memset(mx,0,sizeof(mx));
memset(son,0,sizeof(son));
memset(dep,0,sizeof(dep));
memset(dfn,0,sizeof(dfn));
memset(fa,0,sizeof(fa));
memset(siz,0,sizeof(siz));
memset(top,0,sizeof(top));
memset(v,0,sizeof(v));
dfs_clock = 0;
_rep(i,1,n - 1) {
int u = in(),v = in(),w = in();
edges[i] = {u,v};
g[u].push_back({v,w});
g[v].push_back({u,w});
}
dep[1] = 0; dfs1(1,1); dfs2(1,1);
char opt[14];
while(~scanf("%s",opt + 1)) {
if(!strcmp(opt + 1,"DONE")) break;
else if(!strcmp(opt + 1,"CHANGE")) {
int a = in(),b = in();
MODIFY(a,b);
} else {
int a = in(),b = in();
printf("%d\n",QUERY(a,b));
}
}
}
return 0;
}
将 T 的值改为 1 后镜像过了,但是这里死活过不去