#include using namespace std; typedef long long ll; const int N=5e4+5; int n,q,co[N],tot; int fa[N],sz[N],son[N],dp[N],seg[N],tp[N],rev[N]; vectore[N]; #define L k<<1 #define R k<<1|1 ll s0[N<<2],s1[N<<2],s2[N<<2],tg[N<<2],ans; void dfs1(int x){ sz[x]=1; for(auto v:e[x])if(!sz[v]){ dp[v]=dp[x]+1,fa[v]=x; dfs1(v); sz[x]+=sz[v]; if(sz[v]>sz[son[x]])son[x]=v; } } void dfs2(int x,int t){ tp[x]=t,seg[x]=++seg[0],rev[seg[0]]=x; if(son[x])dfs2(son[x],t); for(auto v:e[x])if(!tp[v])dfs2(v,v); } int lca(int x,int y){ for(int fx=tp[x],fy=tp[y];fx!=fy;x=fa[fx],fx=tp[x])if(dp[fx]>1; pushdown(k); if(x<=mid)modify(L,l,mid,x,y,v); if(y>mid)modify(R,mid+1,r,x,y,v); pushup(k); } ll query(int k,int l,int r,int x,int y){ if(x<=l&&r<=y)return s2[k]-s1[k]; int mid=l+r>>1;ll res=0; pushdown(k); if(x<=mid)res+=query(L,l,mid,x,y); if(y>mid)res+=query(R,mid+1,r,x,y); return res; } ll Query(int k,int l,int r,int x,int y){ if(x<=l&&r<=y)return 2ll*tot*s1[k]-1ll*tot*tot*s0[k]-s2[k]-s1[k]+1ll*tot*s0[k]; int mid=l+r>>1;ll res=0; pushdown(k); if(x<=mid)res+=Query(L,l,mid,x,y); if(y>mid)res+=Query(R,mid+1,r,x,y); return res; } int qsz(int k,int l,int r,int x){ if(l==r)return tg[k]; int mid=l+r>>1; pushdown(k); if(x<=mid)return qsz(L,l,mid,x); else return qsz(R,mid+1,r,x); } void upd(int x,int v){ tot+=v,co[x]^=1; for(int fx=tp[x];x;x=fa[fx],fx=tp[x])modify(1,1,n,seg[fx],seg[x],v); } void build(int k,int l,int r){ if(l==r){ l=rev[l]; s0[k]=l-fa[l]; return; } int mid=l+r>>1; build(L,l,mid),build(R,mid+1,r); s0[k]=s0[L]+s0[R]; } int kth(int x,int k){ while(dp[x]-dp[tp[x]]1)ans+=query(1,1,n,seg[v]+1,seg[v]+sz[v]-1); ans+=1ll*v*S*(S-1); return; } vector >tmp; if(rt==v)ans+=1ll*tot*(tot-1)*v; else{ int u=kth(rt,dp[rt]-dp[v]-1); int S=qsz(1,1,n,seg[u]); tmp.emplace_back(seg[u],seg[u]+sz[u]-1); ans+=1ll*(tot-S)*(tot-S-1)*v; } for(int x=v,fx=tp[x];x;x=fa[fx],fx=tp[x]){ ans+=Query(1,1,n,seg[fx],seg[x]); tmp.emplace_back(seg[fx],seg[x]); } sort(tmp.begin(),tmp.end()); for(int i=1;i