提交时间:2024-07-30 18:53:35

运行 ID: 30824

#include<bits/stdc++.h> using namespace std; #define int long long #define inx(u) int I=h[(u)],v=edge[I].v,w=edge[I].w;I;I=edge[I].nx,v=edge[I].v,w=edge[I].w const int MAXN=200010,B=400,N=25; int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return x*f;} struct Edge{int v,nx,w,u;}edge[MAXN<<1];int h[MAXN],CNT;void add_side(int u,int v,int w){edge[++CNT]={v,h[u],w,u};h[u]=CNT;edge[++CNT]={u,h[v],w,u};h[v]=CNT;} int n,m,a[MAXN],f[MAXN],fa[MAXN][N],dep[MAXN],dfn[MAXN],ed[MAXN],cnt,bel[MAXN]; void dfs(int u,int lst){ dfn[u]=++cnt,fa[u][0]=lst; for(inx(u))if(v!=lst){ f[cnt+1]=f[dfn[u]]+w,dep[v]=dep[u]+1; dfs(v,u); } ed[u]=cnt; } struct fenkuai{ int num[MAXN][B+10],tag[B+10]; void build(){ for(int i=1;i<=n;i++){ num[f[i]][bel[i]]++; } } int qry(int l,int r,int x){ int res=0; if(bel[l]!=bel[r]){ for(int i=(bel[l]-1)*B+1;bel[i]==bel[l];i++){ num[f[i]][bel[l]]--; f[i]+=tag[bel[l]]; } tag[bel[l]]=0; for(int i=(bel[l]-1)*B+1;bel[i]==bel[l];i++){ num[f[i]][bel[l]]++; } for(int i=l;bel[i]==bel[l];i++){ res+=f[i]==x; } for(int i=bel[l]+1;i<bel[r];i++){ res+=num[x-tag[i]][i]; } for(int i=(bel[r]-1)*B+1;bel[i]==bel[r];i++){ num[f[i]][bel[r]]--; f[i]+=tag[bel[r]]; } tag[bel[r]]=0; for(int i=(bel[r]-1)*B+1;bel[i]==bel[r];i++){ num[f[i]][bel[r]]++; } for(int i=r;bel[i]==bel[r];i--){ res+=f[i]==x; } } else{ for(int i=l;i<=r;i++)res+=f[i]==x; } return res; } void upd(int l,int r,int x){ if(bel[l]!=bel[r]){ for(int i=(bel[l]-1)*B+1;bel[i]==bel[l];i++){ num[f[i]][bel[l]]--; f[i]+=tag[bel[l]]; } tag[bel[l]]=0; for(int i=l;bel[i]==bel[l];i++){ f[i]+=x; } for(int i=(bel[l]-1)*B+1;bel[i]==bel[l];i++){ num[f[i]][bel[l]]++; } for(int i=bel[l]+1;i<bel[r];i++){ tag[i]+=x; } for(int i=(bel[r]-1)*B+1;bel[i]==bel[r];i++){ num[f[i]][bel[r]]--; f[i]+=tag[bel[r]]; } tag[bel[r]]=0; for(int i=r;bel[i]==bel[r];i--){ f[i]+=x; } for(int i=(bel[r]-1)*B+1;bel[i]==bel[r];i++){ num[f[i]][bel[r]]++; } } else{ // cout<<bel[l]<<" "<<bel[r]<<endl; // cout<<f[4]<<" "<<f[5]<<" "<<f[6]<<endl; for(int i=l;i<=r;i++){ // cout<<l<<" "<<r<<" "<<i<<" "<<f[i]<<" "<<x<<endl; num[f[i]][bel[i]]--; f[i]+=x; num[f[i]][bel[i]]++; } } } }F; void slv(){CNT=1; n=read(),m=read(); for(int i=1;i<=n;i++)bel[i]=(i-1)/B+1; for(int i=1;i<n;i++){ int u=read(),v=read(),w=read(); add_side(u,v,w); } dfs(1,1); for(int i=1;i<=N-5;i++)for(int j=1;j<=n;j++)fa[j][i]=fa[fa[j][i-1]][i-1]; F.build(); // for(int i=1;i<=n;i++)cout<<f[dfn[i]]<<" "<<dfn[i]<<endl; while(m--){ int op=read(),k=read(); if(op==1){ int u=edge[k<<1].u,v=edge[k<<1].v; if(dep[u]<dep[v])swap(u,v); if(edge[k<<1].w)F.upd(dfn[u],ed[u],-1); else F.upd(dfn[u],ed[u],1); } else{ for(int i=N-5;~i;i--)if(f[dfn[fa[k][i]]]==f[dfn[k]]+F.tag[bel[dfn[k]]])k=fa[k][i]; int p=fa[k][0]; for(int i=N-5;~i;i--)if(f[dfn[fa[p][i]]]==f[dfn[k]]+F.tag[bel[dfn[k]]])p=fa[p][i]; // cout<<k<<" "<<p<<" "<<endl; // cout<<F.qry(dfn[p],ed[p],f[p])<<" "<<F.qry(dfn[k],ed[k],f[k])<<" "<<F.qry(dfn[k],ed[k],f[k]+1)<<endl; printf("%lld\n",F.qry(dfn[p],ed[p],f[dfn[p]])+F.qry(dfn[k],ed[k],f[dfn[k]])+F.qry(dfn[k],ed[k],f[dfn[k]]+1)); } // for(int i=1;i<=n;i++)cout<<f[i]+F.tag[bel[i]]<<" ";cout<<endl; } } signed main(){ slv(); return 0; }