rt,思路是对每个点维护点分树中子树内白点到当前点距离的 set,对每个点的答案再维护一个 set
#include<bits/stdc++.h>
#define P pair<int,int>
#define v e.first
#define w e.second
using namespace std;
const int N=1e5+1;
int a[N],fa[N],siz[N],top[N];
int n,m,cnt,Fa[N],dep[N],dis[N];
multiset<int> S[N],anS;
vector<int> G[N];
vector<P> g[N];
bool del[N];
void dfs1(int u) {
siz[u]=1; for (auto e:g[u]) if (v^fa[u])
fa[v]=u,dis[v]=dis[u]+w,dep[v]=dep[u]+1,dfs1(v),siz[u]+=siz[v];
}
void dfs2(int u,int son=0) {
for (auto e:g[u]) if (v^fa[u]&&siz[v]>siz[son]) son=v;
for (auto e:g[u]) if (v^fa[u]&&v^son) top[v]=v,dfs2(v);
if (son) top[son]=top[u],dfs2(son);
}
void get_size(int u,int fa) {
siz[u]=1; for (auto e:g[u]) if (v^fa&&!del[v])
get_size(v,u),siz[u]+=siz[v];
}
void get_root(int u,int fa,int Siz,int &root) {
int sz=Siz-siz[u]; for (auto e:g[u]) if (v^fa&&!del[v])
get_root(v,u,Siz,root),sz=max(sz,siz[v]); if (sz<<1<=Siz) root=u;
}
int build(int u) {
get_size(u,0),get_root(u,0,siz[u],u),del[u]=true;
for (auto e:g[u]) if (!del[v]) G[u].push_back(build(v) ); return u;
}
int Dis(int x,int y)
{
int a=x,b=y;
while (top[x]^top[y]) {
if (dep[top[x] ]<dep[top[y] ]) swap(x,y);
x=fa[top[x] ];
}
int LCA=dep[x]<dep[y]?x:y;
return dis[a]+dis[b]-dis[LCA]*2;
}
void Dfs(int u,int rt) {
for (int to:G[u]) Dfs(to,rt);
S[rt].insert(Dis(u,rt) );
}
int f(int rt) {
if (S[rt].size()<2) return INT_MIN;
auto it=S[rt].rbegin(); it++;
return *S[rt].rbegin()+*it;
}
void dfs(int u) {
for (int to:G[u]) Fa[to]=u,dfs(to);
Dfs(u,u),anS.insert(f(u) );
}
void change(int x)
{
int u=x;
while (u) {
auto it=anS.find(f(u) ); anS.erase(it);
int d=Dis(x,u); if (a[x]) S[u].insert(d);
else it=S[u].find(d),S[u].erase(it);
anS.insert(f(u) ),u=Fa[u];
}
if (a[x]) cnt++;
else cnt--;
a[x]^=1;
}
int main()
{
cin.tie(0),cin>>n,cnt=n;
for (int i=1;i<n;i++) {
int x,y,z; cin>>x>>y>>z;
g[x].push_back({y,z}),g[y].push_back({x,z});
}
dfs1(1),top[1]=1,dfs2(1);
dfs(build(1) ),cin>>m;
while (m--) {
char c; int x; cin>>c;
if (c=='C') cin>>x,change(x);
else {
if (!cnt) puts("They have disappeared.");
else if (cnt>1) printf("%d\n",max(*anS.rbegin(),0) );
else puts("0");
}
}
return 0;
}