#include <iostream>
#include <vector>
#include <set>
using namespace std;
const int N = 1<<18, M = 998244353;
vector<int> nei[N];
set<int> st;
long long Pre[5][N], R[N];
int Mx[5][N], ind[N];
void dfs(int u, int arr[]){
if (st.size() > 0){
int k = *begin(st);
arr[k] = max(arr[k], ind[u]);
}
if (u > 0)
st.insert(ind[u]);
for (int i : nei[u])
dfs(i, arr);
st.erase(ind[u]);
}
int solve(int n, int m, vector<int> P, vector<vector<int>> L){
for (int i=1;i<n;i++)
nei[P[i]].push_back(i);
srand(time(0));
R[0] = rand();
for (int i=1;i<=n;i++)
R[i] = R[i-1] % M * (rand() + 1);
for (int j=0;j<m;j++){
L[j].insert(L[j].begin(), 0);
for (int i=1;i<n;i++){
ind[L[j][i]] = i;
Pre[j][i] = Pre[j][i-1] ^ R[L[j][i]];
}
dfs(0, Mx[j]);
for (int i=1;i<=n;i++)
Mx[j][i] = max(Mx[j][i], Mx[j][i-1]);
}
int Ans = 0;
for (int i=1;i<n;i++){
long long X = Pre[0][i], t = 1;
for (int j=0;j<m;j++){
t &= (Pre[j][i] == X) and (Mx[j][i] <= i),
Mx[j][i] = Pre[j][i] = 0;
}
Ans += t;
nei[i-1].clear();
}
return Ans;
}