1 /* 2 题意: 3 题解: 4 时间: 5 */ 6 7 #include <bits/stdc++.h> 8 using namespace std; 9 10 typedef long long LL; 11 const int MAXN = 100005; 12 const LL MOD7 = 1e9+7; 13 14 struct Edge 15 { 16 int u,v; 17 int next; 18 }edge[2*MAXN]; 19 int head[MAXN]; 20 int cnt; 21 int top[MAXN]; 22 int fa[MAXN]; 23 int num[MAXN]; 24 int son[MAXN]; 25 int deep[MAXN]; 26 int p[MAXN]; 27 int fp[MAXN]; 28 int pos; 29 30 void init() 31 { 32 cnt=0; 33 memset(head,-1,sizeof(head)); 34 pos=1; 35 memset(son,-1,sizeof(son)); 36 } 37 38 void addEdge(int u,int v) 39 { 40 edge[cnt].u=u;edge[cnt].v=v;edge[cnt].next=head[u];head[u]=cnt++; 41 } 42 43 void dfs1(int u,int pre,int depth) 44 { 45 fa[u]=pre; 46 deep[u]=depth; 47 num[u]=1; 48 for (int i=head[u];i!=-1;i=edge[i].next) 49 { 50 int v=edge[i].v; 51 if (v==pre) continue; 52 dfs1(v,u,depth+1); 53 num[u]+=num[v]; 54 if (son[u]==-1 || num[v]>num[son[u]]) son[u]=v; 55 } 56 } 57 58 void dfs2(int u,int sp) 59 { 60 top[u]=sp; 61 p[u]=pos++; 62 fp[p[u]]=u; 63 if (son[u]==-1) return; 64 dfs2(son[u],sp); 65 for (int i=head[u];i!=-1;i=edge[i].next) 66 { 67 int v=edge[i].v; 68 if (son[u]!=v && v!=fa[u]) dfs2(v,v); 69 } 70 } 71 72 struct TreeNode 73 { 74 int l,r; 75 int Max; 76 }segtree[4*MAXN]; 77 78 void build(int t,int l,int r) 79 { 80 segtree[t].l=l; 81 segtree[t].r=r; 82 segtree[t].Max=0; 83 if (l==r) return; 84 int mid =(l+r)/2; 85 build(2*t,l,mid); 86 build(2*t+1,mid+1,r); 87 } 88 89 void pushUp(int t) 90 { 91 segtree[t].Max = max(segtree[2*t].Max,segtree[2*t+1].Max); 92 } 93 94 void update(int t,int l,int r,int val) 95 { 96 if (segtree[t].l==l && segtree[t].r==r) 97 { 98 segtree[t].Max=val; 99 return; 100 } 101 int mid=(segtree[t].l+segtree[t].r)/2; 102 if (r<=mid) update(2*t,l,r,val); 103 else if (l>mid) update(2*t+1,l,r,val); 104 else update(2*t,l,mid,val),update(2*t+1,mid+1,r,val); 105 pushUp(t); 106 } 107 108 int query(int t,int l,int r) 109 { 110 if (segtree[t].l==l && segtree[t].r==r) 111 { 112 return segtree[t].Max; 113 } 114 int mid=(segtree[t].l+segtree[t].r)/2; 115 if (r<=mid) return query(2*t,l,r); 116 else if (l>mid) return query(2*t+1,l,r); 117 else return max(query(2*t,l,mid),query(2*t+1,mid+1,r)); 118 } 119 120 int Find(int u,int v) 121 { 122 int f1=top[u],f2=top[v]; 123 int tmp=0; 124 while (f1!=f2) 125 { 126 if (deep[f1]<deep[f2]) 127 { 128 swap(f1,f2); 129 swap(u,v); 130 } 131 tmp = max(tmp, query(1, p[f1],p[u])); 132 u=fa[f1]; 133 f1=top[u]; 134 } 135 if (u==v) return tmp; 136 if (deep[u]>deep[v]) swap(u,v); 137 return max(tmp, query(1,p[son[u]],p[v])); 138 } 139 140 int e[MAXN][3]; 141 int n; 142 int main() 143 { 144 #ifndef ONLINE_JUDGE 145 freopen("test.txt","r",stdin); 146 #endif // ONLINE_JUDGE 147 int Case; 148 scanf("%d",&Case); 149 while (Case--) 150 { 151 init(); 152 scanf("%d",&n); 153 for (int i=0;i<n-1;++i) 154 { 155 scanf("%d%d%d",&e[i][0],&e[i][1],&e[i][2]); 156 addEdge(e[i][0],e[i][1]); 157 addEdge(e[i][1],e[i][0]); 158 } 159 dfs1(1,0,0); 160 dfs2(1,1); 161 build(1,0,pos-1); 162 for (int i=0;i<n-1;++i) 163 { 164 if (deep[e[i][0]] > deep[e[i][1]]) 165 swap(e[i][0],e[i][1]); 166 update(1,p[e[i][1]],p[e[i][1]],e[i][2]); 167 } 168 char op[10]; 169 int u,v; 170 while (scanf("%s",op)==1) 171 { 172 if (op[0]=='D') break; 173 scanf("%d%d",&u,&v); 174 if (op[0]=='Q') 175 printf("%d\n",Find(u,v)); 176 else 177 update(1,p[e[u-1][1]],p[e[u-1][1]],v); 178 } 179 } 180 return 0; 181 }