#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5, SQ = 2005;
int n, k, tt, ans, a[N], sz[N], lvl[N], in[N], out[N], rin[N], smlvl[N], mxd[N], csmlvl[N], res[N], li[N], fq[N];
vector<int> adj[N], dep[N];
unordered_map<int, int> cnt[N], ccnt[N];
void dfssz(int u, int d){
dep[a[u]].push_back(d);
sz[u] = 1;
lvl[u] = d;
smlvl[d]++;
in[u] = ++tt;
rin[tt] = u;
cnt[d][a[u]]++;
for(auto v : adj[u]) dfssz(v, d + 1), sz[u] += sz[v], mxd[u] = max(mxd[u], mxd[v]);
out[u] = tt;
mxd[u] = max(mxd[u], d);
}
void add(int u){
ccnt[lvl[u]][a[u]]++;
csmlvl[lvl[u]]++;
}
void rem(int u){
ccnt[lvl[u]][a[u]]--;
csmlvl[lvl[u]]--;
}
void sack(int u, bool d){
pair<int, int> hv;
for(auto v : adj[u]) hv = max(hv, {sz[v], v});
for(auto v : adj[u]) if(v != hv.second) sack(v, 1);
if(hv.second) sack(hv.second, 0);
for(auto v : adj[u]) if(v != hv.second) for(int i = in[v];i<=out[v];i++) add(rin[i]);
add(u);
res[u] = 1;
if(li[a[u]]){
for(auto x : dep[a[u]]){
if(x <= lvl[u]) continue;
res[u] += min(cnt[x][a[u]], csmlvl[x]);
}
}
ans = max(ans, res[u]);
if(d) for(int i = in[u];i<=out[u];i++) rem(rin[i]);
}
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> n >> k;
for(int i = 0;i<n;i++) cin >> a[i], fq[a[i]]++;
for(int i = 0;i<k;i++){
if(fq[i] <= SQ) li[i] = 1;
}
for(int i = 1;i<n;i++){
int u; cin >> u;
adj[u].push_back(i);
}
dfssz(0, 1);
for(int i = 0;i<k;i++){
sort(dep[i].begin(), dep[i].end());
dep[i].erase(unique(dep[i].begin(), dep[i].end()), dep[i].end());
}
sack(0, 0);
cout << ans << '\n';
}