#include "september.h"
#include "bits/stdc++.h"
using namespace std;
#ifdef duc_debug
#include "bits/debug.h"
#else
#define debug(...)
#endif
namespace {
int n, m;
const int maxn = 1e5 + 5;
int par[maxn];
vector<int> g[maxn];
int p[maxn][6], pos[maxn][6];
int lt[maxn][6];
void dfs(int u) {
for (int c = 0; c < m; ++c) {
lt[u][c] = pos[u][c];
}
for (auto v : g[u]) {
dfs(v);
for (int c = 0; c < m; ++c) {
lt[u][c] = max(lt[u][c], lt[v][c]);
}
}
}
}
int solve(int N, int M, vector<int> F, vector<vector<int>> S) {
n = N, m = M;
for (int i = 1; i < n; ++i) {
par[i] = F[i];
g[i].clear();
}
for (int i = 0; i < m; ++i) {
for (int j = 1; j < n; ++j) p[j][i] = S[i][j - 1];
}
for (int i = 1; i < n; ++i) {
for (int j = 0; j < m; ++j) {
pos[p[i][j]][j] = i;
}
g[par[i]].push_back(i);
}
dfs(0);
int res = 0;
vector<int> ptr(m, 1), nxt(m);
for (int i = 0; i < m; ++i) {
nxt[i] = lt[p[1][i]][i];
}
debug(nxt);
while (true) {
if (*min_element(ptr.begin(), ptr.end()) == n) break;
bool ct = 1;
for (int i = 0; i < m; ++i) {
while (ptr[i] <= nxt[i]) {
int val = p[ptr[i]][i];
nxt[i] = max(nxt[i], lt[val][i]);
for (int j = 0; j < m; ++j) {
if (i == j) continue;
nxt[j] = max(nxt[j], pos[val][j]);
}
++ptr[i];
}
}
for (int i = 0; i < m; ++i) {
if (ptr[i] != ptr[0]) {
ct = 0;
break;
}
}
if (ct) {
++res;
for (int i = 0; i < m; ++i) {
if (ptr[i] < n) {
nxt[i] = max(nxt[i], lt[p[ptr[i]][i]][i]);
}
}
}
// debug(res, ptr, nxt);
}
return res;
}