Only AC #1, 2, 20, 21.
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pi;
const int maxn=1e5+10;
int dpu[maxn<<2],dpv[maxn<<2];
int dep[maxn],dfn[maxn],ver[maxn],fath[maxn];
int dp[maxn][20],ans[maxn],id;
vector<pi>edge[maxn];
inline void dfs(int u,int dad){
int v,w;
dep[u]=dep[dad]+1; fath[u]=dad;
dfn[u]=++id,ver[id]=u;
for(pi cur:edge[u]){
v=cur.first,w=cur.second;
if(v==dad) continue;
ans[v]=ans[u]+w; dfs(v,u);
}
return;
}
inline int dis(int u,int v){
if(u==v) return 0;
if(dfn[u]>dfn[v]) swap(u,v);
int k=log2(dfn[v]-dfn[u]);
int ans1=dp[dfn[u]+1][k],ans2=dp[dfn[v]-(1<<k)+1][k];
if(dep[ans1]>dep[ans2]) swap(ans1,ans2);
return ans[u]+ans[v]-(ans[fath[ans1]]<<1);
}
inline void pushup(int p){
int ls=(p<<1),rs=(p<<1|1);
if(!dpu[ls] or !dpv[ls]){
dpu[p]=dpu[rs],dpv[p]=dpv[rs]; return;
}
if(!dpu[rs] or !dpv[rs]){
dpu[p]=dpu[ls],dpv[p]=dpv[ls]; return;
}
int dist=-1e9;
int disll=dis(dpu[ls],dpv[ls]),disrr=dis(dpu[rs],dpv[rs]);
int disuu=dis(dpu[ls],dpu[rs]),disuv=dis(dpu[ls],dpv[rs]);
int disvu=dis(dpv[ls],dpu[rs]),disvv=dis(dpv[ls],dpv[rs]);
if(disll>dist) dpu[p]=dpu[ls],dpv[p]=dpv[ls],dist=disll;
if(disrr>dist) dpu[p]=dpu[rs],dpv[p]=dpv[rs],dist=disrr;
if(disuu>dist) dpu[p]=dpu[ls],dpv[p]=dpu[rs],dist=disuu;
if(disuv>dist) dpu[p]=dpu[ls],dpv[p]=dpv[rs],dist=disuv;
if(disvu>dist) dpu[p]=dpv[ls],dpv[p]=dpu[rs],dist=disvu;
if(disvv>dist) dpu[p]=dpv[ls],dpv[p]=dpv[rs],dist=disvv;
return;
}
inline void build(int p,int pl,int pr){
if(pl==pr){dpu[p]=dpv[p]=ver[pl];return;}
int mid=(pl+pr)>>1;
build(p<<1,pl,mid); build(p<<1|1,mid+1,pr);
return pushup(p);
}
inline void update(int d,int p,int pl,int pr){
if(pl==pr){
if(dpu[p]) dpu[p]=dpv[p]=0;
else dpu[p]=dpv[p]=ver[pl];
return;
}
int mid=(pl+pr)>>1;
if(d<=mid) update(d,p<<1,pl,mid);
else update(d,p<<1|1,mid+1,pr);
return pushup(p);
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int n;cin>>n;
char opt; int u,v,w;
for(int i=1;i<n;i++){
int u,v,w;cin>>u>>v>>w;
edge[u].emplace_back(v,w);
edge[v].emplace_back(u,w);
}
dfs(1,0);
for(int i=1;i<=n;i++) dp[dfn[i]][0]=i;
for(int k=1;k<=log2(n);k++){
int top=n-(1<<k)+1;
for(int i=1,j=((1<<k-1)|1);i<=top;i++,j++){
if(dep[dp[i][k-1]]<dep[dp[j][k-1]]){
dp[i][k]=dp[i][k-1];
}
else dp[i][k]=dp[j][k-1];
}
}
build(1,1,n);
int q;cin>>q;
for(int i=1;i<=q;i++){
cin>>opt;
if(opt=='A'){
if(dpu[1]) cout<<dis(dpu[1],dpv[1])<<"\n";
else cout<<"They have disappeared.\n";
}
else cin>>u,update(dfn[u],1,1,n);
}
return 0;
}