#ifndef TESTER_LOCAL
#include "september.h"
#endif
#include <functional>
#include <cstdio>
#include <vector>
#include <set>
#include <map>
using namespace std;
int solve(int N, int M, std::vector<int> F, std::vector<std::vector<int>> S) {
vector<vector<int>> C(N);
for (int x = 1; x < N; x++)
C[F[x]].push_back(x);
int CC[N];
for (int x = 0; x < N; x++)
CC[x] = C[x].size();
set<int> removed, toberemoved;
function<void(int)> dfs = [&](int n) {
for (int c: C[n]) {
if (toberemoved.count(c) || removed.count(c)) continue;
toberemoved.insert(c);
CC[n]--;
dfs(c);
}
};
// printf("AWA\n");
int K = 0;
int badfllstate = 0;
map<int, int> FLL;
for (int i = 0; i < N - 1; i++) {
// printf("===\n");
// for (int x: removed)
// printf("%d ", x);
// printf("\n");
// for (int x: toberemoved)
// printf("%d ", x);
// printf("\n");
for (int x = 0; x < M; x++) {
if (!FLL[S[x][i]]) {
badfllstate++;
int n = S[x][i];
toberemoved.insert(n);
while (F[n] != -1 && toberemoved.count(n)) {
toberemoved.erase(n);
removed.insert(n);
if (!CC[F[n]])
n = F[n];
else
break;
}
dfs(S[x][i]);
}
FLL[S[x][i]]++;
if (FLL[S[x][i]] == M) badfllstate--;
}
if (!badfllstate && toberemoved.empty()) {
K++;
}
}
return K;
}
#ifdef TESTER_LOCAL
#include "stub.cpp"
#endif