#include "september.h"
#include <bits/stdc++.h>
#define int long long
#define emb emplace_back
#define pii pair <int, int>
#define tiii tuple <int, int, int>
#define tdii tuple <double, int, int>
#define all(a) a.begin(), a.end()
using namespace std;
const int N = 1e5 + 5;
const double inf = 1e18;
int n, m;
vector <int> adj[N];
int32_t solve(int32_t Nn, int32_t M, std::vector<int32_t> F, std::vector<std::vector<int32_t>> S) {
n = Nn;
m = M;
for (int i = 0; i < n; i++) adj[i].clear();
for (int i = 1; i < n; i++) {
adj[i].emb(F[i]);
adj[F[i]].emb(i);
}
vector <int> pre[n];
for (int u = 0; u < n; u++) {
for (auto v : adj[u]) {
if (v == F[u]) continue;
pre[u].emb(v);
}
}
set <int> cur[m];
bool visited[m][n]; memset(visited, 0, sizeof visited);
int ans = 0;
set <int> vis;
for (int i = 0; i < n-1; i++) {
bool ok = 1;
// cout << i << " : \n";
for (int j = 0; j < m; j++) {
auto u = S[j][i];
vis.emplace(u);
// cout << u << ": ";
for (auto v : pre[u]) {
// cout << v << " ";
if (!visited[j][v]) cur[j].emplace(v);
}
visited[j][u] = 1;
if (cur[j].find(u) != cur[j].end()) cur[j].erase(u);
// cout << "\n";
if (cur[j].size()) ok = 0;
// for (auto e : cur[j]) cout << e << " ";
// cout << "\n";
}
// cout << "--------------------\n";
if (ok && vis.size() == i + 1) ans++;
}
return ans;
}