10 LcaEdge(
const vector<vector<pair<
int,Type>>>& g,
int root=0) {
14 par=vector<vector<
int>>(k,vector<
int>(n,-1)),dep=vector<
int>(n),dat=vector<vector<Type>>(k,vector<Type>(n,Monoid::id()));
16 for(
int i=0; i<k-1; i++)
for(
int j=0; j<n; j++) {
17 par[i+1][j]=par[i][j]==-1?-1:par[i][par[i][j]];
18 dat[i+1][j]=par[i][j]==-1?Monoid::id():Monoid::op(dat[i][j],dat[i][par[i][j]]);
24 if(dep[u]>dep[v]) swap(u,v);
25 Type ret=Monoid::id();
26 while(dep[u]<dep[v]) {
28 while((dep[v]-dep[u])>=(1<<(k+1))) k++;
29 ret=Monoid::op(ret,dat[k][v]),v=par[k][v];
33 while(par[k+1][u]!=par[k+1][v]) k++;
34 ret=Monoid::op(ret,dat[k][u]),ret=Monoid::op(ret,dat[k][v]);
35 u=par[k][u],v=par[k][v];