rt,用的 set 维护 dfn 计算答案
#include<bits/stdc++.h>
#define N 100005
#define M 18
#define int long long
using namespace std;
int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int n,m,num,dfn[N],ct,id[N];
long long ans;
struct fig
{
int to,next,w;
}k[N*2];int head[N],tot,fa[18][N],dis[N],dep[N];
void add(int from,int to,int w)
{
k[++tot].to=to;
k[tot].w=w;
k[tot].next=head[from];
head[from]=tot;
}
void dfs(int now,int f)
{
fa[0][now]=f;dep[now]=dep[f]+1;dfn[now]=++ct;id[ct]=now;
for(int i=1;i<M;i++)fa[i][now]=fa[i-1][fa[i-1][now]];
for(int i=head[now];i;i=k[i].next)
{
if(k[i].to==f)continue;
dis[k[i].to]=dis[now]+k[i].w;
dfs(k[i].to,now);
}
}
int lca(int a,int b)
{
if(dep[a]<dep[b])swap(a,b);
for(int i=17;i>=0;i--)if(dep[fa[i][a]]>=dep[b])a=fa[i][a];
if(a==b)return a;
for(int i=17;i>=0;i--)if(fa[i][a]!=fa[i][b])a=fa[i][a],b=fa[i][b];
return fa[0][a];
}
int get(int a,int b){return dis[a]+dis[b]-2*dis[lca(a,b)];}
set<int> s;bool vis[N];
signed main()
{
n=read();m=read();
for(int i=1,u,v,w;i<n;i++)
{
u=read();v=read();w=read();
add(u,v,w);add(v,u,w);
}
dfs(1,0);
for(int i=1,x;i<=m;i++)
{
x=dfn[read()];
if(vis[id[x]])
{
num--;auto it=s.lower_bound(x);
if(num)
{
set<int>::iterator a,b;
++it;if(it!=s.end())ans-=get(id[x],id[*it]),a=it;
else ans-=get(id[x],id[*s.begin()]),a=s.begin();
--it;if(it!=s.begin())ans-=get(id[x],id[*(--it)]),b=it;
else ans-=get(id[x],id[*(--s.end())]),b=--s.end();
if(num>1)ans+=get(id[*a],id[*b]);
s.erase(++it);
}
else s.erase(it);vis[id[x]]=0;
}
else
{
if(num)
{
auto it=s.upper_bound(x);
set<int>::iterator a,b;
if(it!=s.end())ans+=get(id[x],id[*it]),a=it;
else ans+=get(id[x],id[*s.begin()]),a=s.begin();
if(it!=s.begin())ans+=get(id[x],id[*(--it)]),b=it;
else ans+=get(id[x],id[*(--s.end())]),b=--s.end();
if(num>1)ans-=get(id[*a],id[*b]);
}
s.insert(x);vis[id[x]]=1;num++;
}
cout<<ans<<"\n";
}
return 0;
}