#include <bits/stdc++.h>
using namespace std;
const int MAX_N=100005;
vector<int> adj[MAX_N];
int preferred[MAX_N];
int st[MAX_N];
int ed[MAX_N];
int depth[MAX_N];
int xd[MAX_N];
int timer=0;
vector<int> dn[MAX_N];
vector<int> nodes[MAX_N];
vector<int> lang[MAX_N];
void dfs(int u, int d)
{
st[u]=++timer;
depth[u]=d;
xd[u]=d;
dn[d].push_back(st[u]);
for(int v : adj[u])
{
dfs(v,d+1);
xd[u]=max(xd[u],xd[v]);
}
ed[u]=timer;
}
int range(const vector<int>& v, int l, int r)
{
return upper_bound(v.begin(),v.end(),r)-lower_bound(v.begin(),v.end(),l);
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
int n,k;
cin>>n>>k;
for(int i=0; i<n; i++)
{
cin>>preferred[i];
nodes[preferred[i]].push_back(i);
}
for(int i=1; i<n; i++)
{
int boss;
cin>>boss;
adj[boss].push_back(i);
}
dfs(0,0);
for(int g=0; g<k; g++)
{
for(int u : nodes[g])
{
lang[g].push_back(st[u]);
}
sort(lang[g].begin(),lang[g].end());
}
int xp=0;
int ns=0;
for(int g=0; g<k; g++)
{
if(nodes[g].empty())
{
continue;
}
vector<pair<int,int>> cg;
vector<int> dl;
for(int u : nodes[g])
{
dl.push_back(depth[u]);
}
sort(dl.begin(),dl.end());
for(int i=0; i<(int)dl.size(); )
{
int d=dl[i];
int cnt=0;
while(i<(int)dl.size() && dl[i]==d)
{
cnt++;
i++;
}
cg.push_back({d,cnt});
}
for(int u : nodes[g])
{
int cp=0;
auto its=lower_bound(cg.begin(),cg.end(),make_pair(depth[u],-1));
auto ite=upper_bound(cg.begin(),cg.end(),make_pair(xd[u],n+1));
for(auto it=its; it!=ite; it++)
{
int d=it->first;
int c=it->second;
int s=range(dn[d],st[u],ed[u]);
cp+=min(s,c);
}
int iu=range(lang[g],st[u],ed[u]);
int cs=cp-iu;
if(cp>xp)
{
xp=cp;
ns=cs;
}
else if(cp==xp)
{
if(cs<ns)
{
ns=cs;
}
}
}
}
cout<<xp<<" "<<ns<<endl;
return 0;
}