#include <iostream>
#include <vector>
#include <set>
using namespace std;
#include "september.h"
vector<vector<int>> adj;
vector<int> subtreeSize;
vector<int> subtreeSum;
set<int> picked;
void findSize(int st){
for(auto i : adj[st]) findSize(i);
int ans = 1;
for(auto i : adj[st]) ans += subtreeSize[i];
subtreeSize[st] = ans;
}
void dfs(int st){
for(auto i : adj[st]) dfs(i);
subtreeSum[st] = (picked.find(st) != picked.end());
for(auto i : adj[st]) subtreeSum[st] += subtreeSum[i];
}
int solve(int N, int M, vector<int> F, vector<vector<int>> S){
adj.assign(N, {});
subtreeSize.assign(N, 0);
for(int i = 1; i<N; i++) adj[F[i]].push_back(i);
findSize(0);
int ans = 0;
for(int i = 0; i<N-1; i++){
for(int j = 0; j<M; j++) picked.insert(S[j][i]);
if(picked.size() == i+1){
subtreeSum.assign(N, 0);
dfs(0);
int addAns = 1;
for(auto k:picked) if(subtreeSize[k] != subtreeSum[k]) addAns = 0;
ans += addAns;
}
}
return ans;
}