提交时间:2024-07-30 13:11:10

运行 ID: 30747

#include <bits/stdc++.h> using namespace std; // #define int long long #define endl "\n" #define pii pair<int,int> #define p1(x) x.first #define p2(x) x.second int n,q; bool w[200300]; int u[200300],v[200300],lst[200300]; vector<int>op[200300<<2]; vector<int>g[200300]; int fa[203000]; int f[200300],siz[200300],exs[200300],dep[200300]; int ask[200300]; int res[200300]; #define lc(x) (x<<1) #define rc(x) (x<<1|1) inline void dfs(int u){ f[u]=u,siz[u]=1,exs[u]=0; dep[u]=dep[fa[u]]+1; for(int v:g[u]) if(v!=fa[u]){ exs[u]++; fa[v]=u; dfs(v); } } inline void mod(int x,int l,int r,int L,int R,int k){ if(L<=l&&r<=R){ op[x].push_back(k); return ; } int mid=l+r>>1; if(L<=mid)mod(lc(x),l,mid,L,R,k); if(R>mid)mod(rc(x),mid+1,r,L,R,k); } inline int ff(int x){while(f[x]!=x)x=f[x];return x;} int tp=0; pii S[200030]; inline void merge(int x,int y){ x=ff(x),y=ff(y); assert(x!=y); if(dep[x]>dep[y])swap(x,y); // cout<<x<<"x"<<y<<" "; int t=ff(fa[x]); if(t)exs[t]+=siz[y]; siz[x]+=siz[y]; exs[x]+=exs[y]-siz[y]; // cout<<siz[x]<<" "<<exs[x]<<endl;cout.flush(); if(siz[x]>=siz[y])f[y]=x,S[++tp]={y,0}; else{ swap(fa[x],fa[y]); swap(siz[x],siz[y]); swap(exs[x],exs[y]); f[x]=y; S[++tp]={x,1}; } // cout<<tp<<endl; } inline void rvk(){ // cout<<tp<<" "; if(!tp)return ; int x=p1(S[tp]),tps=p2(S[tp]),y=f[x]; tp--; // cout<<x<<"!"<<y<<" "<<tp<<endl;cout.flush(); f[x]=x; if(!tps){ siz[y]-=siz[x]; exs[y]-=exs[x]-siz[x]; int t=ff(fa[y]); if(t)exs[t]-=siz[x]; } else{ swap(fa[x],fa[y]); swap(siz[x],siz[y]); swap(exs[x],exs[y]); siz[x]-=siz[y]; exs[x]-=exs[y]-siz[y]; int t=ff(fa[x]); if(t)exs[t]-=siz[y]; } } inline void calc(int x,int l,int r){ if(l==r){ if(!ask[l])return ; int k=ask[l]; // cout<<k<<" "; k=ff(k); // cout<<siz[k]<<" "<<exs[k]<<" "<<siz[ff(fa[k])]<<endl; res[l]=siz[k]+exs[k]+siz[ff(fa[k])]; return ; } int k=op[x].size(); for(int x:op[x]) merge(u[x],v[x]); int mid=l+r>>1; calc(lc(x),l,mid); calc(rc(x),mid+1,r); // cout<<"!!!!"<<k<<endl; while(k--)rvk(); } signed main(){ ios::sync_with_stdio(0); // freopen("op.in","r",stdin); // freopen("op.out","w",stdout); int C=clock(); cin>>n>>q; for(int i=1;i<n;i++){ cin>>u[i]>>v[i]>>w[i]; if(!w[i])lst[i]=1; else lst[i]=-1; g[u[i]].push_back(v[i]); g[v[i]].push_back(u[i]); } dfs(1); for(int i=1;i<n;i++) if(dep[u[i]]>dep[v[i]])swap(u[i],v[i]); for(int i=1;i<=q;i++){ int op; cin>>op; if(op==1){ int x; cin>>x; if(w[x])lst[x]=i; else mod(1,1,q,lst[x],i,x),lst[x]=-1; w[x]^=1; } else cin>>ask[i]; } for(int i=1;i<n;i++) if(lst[i]!=-1)mod(1,1,q,lst[i],q,i); calc(1,1,q); for(int i=1;i<=q;i++) if(ask[i])cout<<res[i]<<endl; // cerr<<(clock()-C)*1000/CLOCKS_PER_SEC<<endl; fflush(stdout); cout.flush(); return 0; }