#include "september.h"
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
vector<int> g[N];
struct UWU{
//req is unused in st
set<int> nxt,exc,req,uns;
void init(){
for(auto v:g[0]){
nxt.insert(v);
}
}
void ins(int x){
if(nxt.find(x)!=nxt.end()){
nxt.erase(x);
for(auto v:g[x]){
if(exc.find(v)!=exc.end()){
exc.erase(v);
}
else nxt.insert(v);
}
}
else exc.insert(x);
}
};
int solve(int N, int M, std::vector<int> F, std::vector<std::vector<int>> S) {
UWU hode[10];
UWU st;
for(int i=1;i<N;i++) g[F[i]].push_back(i);
st.init();
int cnt=0;
for(int i=1;i<M;i++) hode[i].init();
for(int i=N-2;i>=0;i--){
//cout<<"I" <<"\n";
bool cl=true;
st.ins(S[0][i]);
// for(auto x:st.nxt) cout<<x <<" ";
// cout<<"\n";
// for(auto x:st.exc) cout<<x <<" ";
// cout<<"\n\n";
if(!st.exc.empty()) cl=false;
for(int j=1;j<M;j++) hode[j].ins(S[j][i]);
//for(int j=1;j<M;j++) if(!hode[j].exc.empty()) cl=false;
for(int j=1;j<M;j++){
if(hode[j].uns.find(S[0][i])!=hode[j].uns.end()) hode[j].uns.erase(S[0][i]);
else hode[j].req.insert(S[0][i]);
if(hode[j].req.find(S[j][i])!=hode[j].req.end()) hode[j].req.erase(S[j][i]);
else hode[j].uns.insert(S[j][i]);
}
for(int j=1;j<M;j++) if(!hode[j].req.empty()) cl=false;
if(cl) cnt++;
}
return cnt;
}