提交时间:2024-07-30 13:03:40
运行 ID: 30740
#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define p_b push_back #define m_p make_pair #define p1 first #define p2 second using namespace std; typedef long long ll; const int maxn=1e6+10,mod=1e9+7; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } int n,q,dfn[maxn],siz[maxn],fa[maxn][20],dep[maxn],C;vector<int>v[maxn]; struct node { int x,y,c; }d[maxn]; struct Block { int bel[maxn],len,tag[maxn],a[maxn];vector<int>P[maxn]; void init(){ len=sqrt(n); up(i,1,n)bel[i]=(i-1)/len+1; up(i,1,n)P[bel[i]].p_b(0); }void upd(int l,int r,int x){ if(bel[l]==bel[r]){ int b=bel[l]; up(i,l,r){ P[b].erase(lower_bound(P[b].begin(),P[b].end(),a[i])); P[b].insert(lower_bound(P[b].begin(),P[b].end(),a[i]+x),a[i]+x); a[i]+=x; }return; }upd(l,bel[l]*len,x),upd((bel[r]-1)*len+1,r,x); up(i,bel[l]+1,bel[r]-1)tag[i]+=x; }int qry(int l,int r,int lim){ if(bel[l]==bel[r]){ int ct=0; up(i,l,r)if(a[i]+tag[bel[l]]<=lim)ct++; return ct; }int res=qry(l,bel[l]*len,lim); res+=qry((bel[r]-1)*len+1,r,lim); up(i,bel[l]+1,bel[r]-1){ if(tag[i]>lim)continue; auto it=upper_bound(P[i].begin(),P[i].end(),lim-tag[i]); res+=it-P[i].begin(); }return res; }int g(int l){return a[l]+tag[bel[l]];} }B; void dfs(int u){ dfn[u]=++C,siz[u]=1; for(int x:v[u])if(x!=fa[u][0]){ fa[x][0]=u,dep[x]=dep[u]+1;dfs(x);siz[u]+=siz[x]; } }int qry(int u){ int x=B.g(dfn[u]); down(i,19,0)if(fa[u][i]&&B.g(dfn[fa[u][i]])==x)u=fa[u][i]; int res=B.qry(dfn[u],dfn[u]+siz[u]-1,x+1); if(u==1)return res;u=fa[u][0];x--; down(i,19,0)if(fa[u][i]&&B.g(dfn[fa[u][i]])==x)u=fa[u][i]; res+=B.qry(dfn[u],dfn[u]+siz[u]-1,x); return res; } void slv(){ n=read(),q=read();up(i,1,n-1)d[i].x=read(),d[i].y=read(),d[i].c=read(),v[d[i].x].p_b(d[i].y),v[d[i].y].p_b(d[i].x); dfs(1);up(i,1,19)up(j,1,n)fa[j][i]=fa[fa[j][i-1]][i-1]; B.init();up(i,1,n-1){ if(dep[d[i].x]>dep[d[i].y])swap(d[i].x,d[i].y); if(d[i].c)B.upd(dfn[d[i].y],dfn[d[i].y]+siz[d[i].y]-1,1); }while(q--){ int op=read(),x=read(); if(op==2)printf("%d\n",qry(x)); else { if(d[x].c)d[x].c=0,B.upd(dfn[d[x].y],dfn[d[x].y]+siz[d[x].y]-1,-1); else d[x].c=1,B.upd(dfn[d[x].y],dfn[d[x].y]+siz[d[x].y]-1,1); } } }int main(){ slv(); fclose(stdin); fclose(stdout); return 0; }