#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n, k, a[N], ans, mi, occur[N], C[N], h[N];
vector<int> child[N];
map<int, int> cnt[N];
void bfs(int v)
{
  queue<int> Q;
  Q.push(v);
  int X = 0;
  while(Q.size())
    {
      int u = Q.front();
      Q.pop();
      X += (a[v] == a[u]);
      C[h[u]]++;
      for(int c : child[u])
	Q.push(c);
    }
  int sol = 0;
  for(int i = h[v]; C[i] > 0; i++)
    {
      sol += min(C[i], cnt[a[v]][i]);
      C[i] = 0; 
    }
  if(sol > ans)
    ans = sol, mi = sol - X;
  else if(sol == ans)
    mi = min(sol - X, mi);
  
}
void dfs(int v, int color)
{
  if(a[v] == color)
    {
      bfs(v);
      return;
    }
  
  for(int c : child[v])
    dfs(c, color);
}
int main()
{
  cin >> n >> k;
  for(int i = 0; i < n; i ++)
    {
      cin >> a[i];
      occur[a[i]]++;
    }
  cnt[a[0]][0]++;
  for(int i = 1; i < n; i ++)
    {
      int p;
      cin >> p;
      child[p].push_back(i);
      h[i] = h[p] + 1;
      cnt[a[i]][h[i]]++;
    }
  for(int i = 0; i < k; i ++)
    dfs(0, i);
  cout << ans << ' ' << mi << endl;  
  return 0;
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |