#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 10;
int val[MAXN];
int pre[MAXN], pos[MAXN], dist[MAXN];
int tot[MAXN], cnt[MAXN], lvl[MAXN];
vector<int> adj[MAXN], vtx[MAXN];
int n;
int t = 0;
void dfs_1(int v){
pre[v] = ++t;
for(auto u : adj[v]){
dist[u] = dist[v] + 1;
dfs_1(u);
}
pos[v] = t;
}
pair<int, int> process(int s, int k){
queue<int> q;
q.push(s);
vector<int> visited;
while(!q.empty()){
int v = q.front();
q.pop();
if(tot[dist[v]] == 0) visited.push_back(dist[v]);
tot[dist[v]] ++;
if(val[v] == k) cnt[dist[v]] ++;
for(auto u : adj[v]) q.push(u);
}
pair<int, int> ret = {0, 0};
for(auto d : visited){
int cur = min(tot[d], lvl[d]);
ret.first += cur;
ret.second -= cur - cnt[d];
tot[d] = cnt[d] = 0;
}
return ret;
}
pair<int, int> dfs_2(int v, int k){
pair<int, int> ret = {0, -n};
if(val[v] == k) return process(v, k);
for(auto u : adj[v]) ret = max(ret, dfs_2(u, k));
return ret;
}
pair<int, int> solve(int k){
for(int i=0; i<n; i++) lvl[i] = 0;
for(auto v : vtx[k]) lvl[dist[v]] ++;
return dfs_2(1, k);
}
int main(){
cin.tie(0)->sync_with_stdio(0);
int k; cin >> n >> k;
for(int i=1; i<=n; i++){
cin >> val[i];
vtx[val[i]].push_back(i);
}
for(int i=0; i<k; i++){
sort(vtx[i].begin(), vtx[i].end(), [&] (int a, int b){
return pre[a] < pre[b];
});
}
for(int i=2; i<=n; i++){
int p; cin >> p;
p ++;
adj[p].push_back(i);
}
int res = 0;
for(int i=0; i<k; i++) res = max(res, (int) vtx[i].size());
cout << res << " 0\n";
return 0;
pair<int, int> ans = {0, -n};
dfs_1(1);
for(int i=0; i<k; i++) ans = max(ans, solve(i));
cout << ans.first << " " << -ans.second << "\n";
return 0;
}