rt,WA在第一个点,反过来处理合并的作法。
#include<bits/stdc++.h>
#define int long long
#define pii pair<int,int>
using namespace std;
int t,n,q,e[300005],flg[300005],f[300005][19],dep[300005],length[300005];
struct edge1{
int v,w,id;
};
vector<edge1>g[300005];
struct edge{
int x,y;
}edges[300005];
void dfs(int u,int fa){
dep[u]=dep[fa]+1;f[u][0]=fa;
for(int i=1;i<=18;i++)f[u][i]=f[f[u][i-1]][i-1];
for(auto v:g[u]){
if(v.v==fa)continue;
length[v.v]=length[u]+v.w;
dfs(v.v,u);
}
}
int lca(int x,int y){
if(dep[x]>dep[y])swap(x,y);
while(dep[y]-dep[x]){
y=f[y][(int)log2(dep[y]-dep[x])];
}
if(x==y)return x;
for(int i=18;i>=1;i--){
if(f[x][i]!=f[y][i]){
x=f[x][i];
y=f[y][i];
}
}
return f[x][0];
}
struct DSU{
int f[300005];
void init(int n){for(int i=1;i<=n;i++)f[i]=i;}
int finds(int x){return f[x]==x?x:f[x]=finds(f[x]);}
}dsu;
int vis[300005];
void dfs2(int u,int fa,int flag){
vis[u]=flag;
for(auto v:g[u]){
if(v.v==fa)continue;
if(flg[v.id])continue;
dfs2(v.v,u,flag);
}
}
int farest=0,far=0;
void dfs3(int u,int fa,int dep){
if(dep>=far)far=dep,farest=u;
for(auto v:g[u]){
if(v.v==fa)continue;
if(flg[v.id])continue;
dfs3(v.v,u,dep+v.w);
}
}
int dis(int x,int y){
return length[x]+length[y]-2ll*length[lca(x,y)];
}
int zj1[300005],zj2[300005],ans[300005];
signed main(){
cin>>t;
while(t--){
cin>>n>>q;
for(int i=1;i<=n;i++){
vis[i]=0;dep[i]=length[i]=0;
zj1[i]=zj2[i]=ans[i]=0;
flg[i]=0,g[i].clear();
edges[i]={0,0};
memset(f[i],0,sizeof f[i]);
}
for(int i=1;i<n;i++){
int u,v,w;
cin>>u>>v>>w;
edges[i]={u,v};
g[u].push_back({v,w,i});
g[v].push_back({u,w,i});
}
for(int i=1;i<=q;i++){
cin>>e[i];
flg[e[i]]=1;
}
dfs(1,0);
int lcnt=0;int maxdis=0;
for(int i=1;i<=n;i++){
if(!vis[i]){
dfs2(i,-1,++lcnt);
farest=far=0;
dfs3(i,-1,0);
int d1=farest;
farest=far=0;
dfs3(d1,-1,0);
int d2=farest;
zj1[vis[i]]=d1;
zj2[vis[i]]=d2;
maxdis=max(maxdis,far);
}
}dsu.init(lcnt);
for(int i=q;i>=1;i--){
ans[i]=maxdis;
int idx=vis[edges[e[i]].x],idy=vis[edges[e[i]].y];
int fx=dsu.finds(idx),fy=dsu.finds(idy);
int d[4]={zj1[fx],zj2[fx],zj1[fy],zj2[fy]};
pii dres={0,0};int maxdisbet=0;
for(int i1=0;i1<=3;i1++){
for(int j=i1+1,x;j<=3;j++){
x=dis(d[i1],d[j]);
if(x>maxdisbet){
maxdisbet=x;
dres={d[i1],d[j]};
}
}
}
dsu.f[fx]=fy;
// cout<<d[0]<<"->"<<d[1]<<" and "<<d[2]<<"->"<<d[3]<<" = "<<dres.first<<"->"<<dres.second<<" "<<edges[e[i]].x<<" "<<edges[e[i]].y<<endl;
zj1[fy]=dres.first,zj2[fy]=dres.second;
maxdis=max(maxdis,maxdisbet);
}
for(int i=1;i<=q;i++)cout<<ans[i]<<endl;
}
return 0;
}