17 dat=vector<vector<Type>>(Log+1,vector<Type>(n,Monoid::id()));
18 nxt=vector<vector<
int>>(Log+1,vector<
int>(n));
19 for(
int i=0; i<n; i++) dat[0][i]=v[i], nxt[0][i]=p[i];
20 for(
int i=1; i<=Log; i++)
for(
int j=0; j<n; j++) {
21 nxt[i][j]=nxt[i-1][nxt[i-1][j]];
22 dat[i][j]=Monoid::op(dat[i-1][j], dat[i-1][nxt[i-1][j]]);