#pragma comment(linker, "/STACK:102400000,102400000") #include #include #include #include #include #include using namespace std; const int N=200005; #define Log 22 struct Edge { int v; Edge *nxt; }memo[N*10],*cur,*h_bef[N],*h_aft[N]; void addEdge(int u,int v,Edge* head[]) { cur->v=v; cur->nxt=head[u]; head[u]=cur++; } int bnum,bn[N]; vector block[N]; bool iscut[N]; bool vis[N]; stack stk; int dfn[N],low[N],son_root,idx; int lab[N],id[N],son[N],fa[N]; int dp[N][Log],dep[N]; void tarjan(int pt_u,int pt_pre) { stack stk_tar; stk_tar.push(pt_u); fa[pt_u]=pt_pre; while(stk_tar.size()) { int u=stk_tar.top(); int pre=fa[u]; if(dfn[u]==0) dfn[u]=low[u]=++idx,stk.push(u); Edge* it; for(it=h_bef[u];it;it=it->nxt) { int v=it->v; if(v==pre) continue; if(fa[v]==-1) { fa[v]=u; stk_tar.push(v); h_bef[u]=it; break; } else { if(fa[v]==u) { low[u]=min(low[u],low[v]); if(dfn[u]<=low[v]) { if(pre==-1) son_root++; else iscut[u]=1; while(1) { int top=stk.top(); stk.pop(); block[bnum].push_back(top); if(top==v) break; } block[bnum].push_back(u); bnum++; } } else low[u]=min(low[u],dfn[v]); } } if(it==NULL) stk_tar.pop(); } } void dfs(int u,int pre,int cnt,int iid) { dep[u]=dep[ dp[u][0] ]+1; for(int i=1;inxt) { int v=it->v; if(v!=pre) { dp[v][0]=u; dfs(v,u,son[u],iid); } } } int lca(int u,int v) { if(dep[u]=0;st>>=1,i--) { if(st<=dep[u]-dep[v]) { u=dp[u][i]; } } if(u==v) return u; for(int i=Log-1;i>=0;i--) { if(dp[u][i]!=dp[v][i]) { u=dp[u][i]; v=dp[v][i]; } } return dp[u][0]; } void init() { cur=memo; memset(h_bef,0,sizeof(h_bef)); memset(h_aft,0,sizeof(h_aft)); memset(dp,0,sizeof(dp)); bnum=0; idx=0; son_root=0; while(stk.size()) stk.pop(); for(int i=0;i1) iscut[i]=1; } int k=0; for(int i=0;i