WA了0分,能过样例
#include<iostream>
#include<vector>
#include<set>
#define N 100005
using namespace std;
int n,m,a[N],b[N],fa[N][25];
long long f[N],dp[N],tot;
struct edge{
int to;
long long w;
};
vector<edge> g[N];
bool vis[N];
set<int> s;
set<int>::iterator it;
long long ans;
void dfs(int x,int u){
fa[u][0]=x;
dp[u]=dp[x]+1;
a[u]=++tot;
b[tot]=u;
for(int i=1;i<=20;i++){
fa[u][i]=fa[fa[u][i-1]][i-1];
}
for(int i=0;i<g[u].size();i++){
if(g[u][i].to!=x){
f[g[u][i].to]=f[u]+g[u][i].w;
dfs(u,g[u][i].to);
}
}
}
int lca(int x,int y){
if(dp[x]<dp[y]) swap(x,y);
for(int i=20;i>=0;i--){
if(dp[fa[x][i]]>=dp[y]) x=fa[x][i];
}
if(x==y) return x;
for(int i=20;i>=0;i--){
if(dp[fa[x][i]]!=dp[fa[y][i]]){
x=fa[x][i],y=fa[y][i];
}
}
return fa[x][0];
}
long long dist(int x,int y){
return f[x]+f[y]-2*f[lca(x,y)];
}
int main(){
cin>>n>>m;
for(int i=1,x,y,z;i<n;i++){
cin>>x>>y>>z;
g[x].push_back((edge){y,z});
g[y].push_back((edge){x,z});
}
dfs(0,1);
for(int i=1,x,y,z;i<=m;i++){
cin>>x;
x=a[x];
if(!vis[b[x]]) s.insert(x);
it=s.lower_bound(x);
if(it==s.begin()) y=b[*--s.end()];
else y=b[*--it];
it=s.upper_bound(x);
if(it==s.end()) z=b[*s.begin()];
else z=b[*it];
if(vis[b[x]]) s.erase(x);
x=b[x];
long long dis=dist(x,y)+dist(x,z)-dist(y,z);
if(!vis[x]) ans+=dis,vis[x]=true;
else ans-=dis,vis[x]=false;
cout<<ans<<endl;
}
return 0;
}
悬2关,感激不尽