#include <bits/stdc++.h>
using namespace std;
int n, k;
int p[100000], depths[100000], colours[100000];
vector<int> child[100000];
int freq[2001], bigfreq[2001];
int cnt;
void dfs(int i, int depth) {
    depths[i] = depth;
    for (int u: child[i]) dfs(u,depth+1);
}
void in(int i, int colour) {
    if (colours[i] == colour) cnt++;
    else freq[depths[i]]++;
    for (int u: child[i]) in(u,colour);
}
void out(int i, int colour, int lead) {
    if (i==lead) return;
    if (colours[i] == colour) bigfreq[depths[i]]++;
    for (int u: child[i]) out(u,colour,lead);
}
signed main() {
    cin >> n >> k;
    for (int i = 0; i < n; i++) cin >> colours[i];
    for (int i = 1; i < n; i++) {
        cin >> p[i];
        child[p[i]].push_back(i);
    }
    dfs(0,0);
    
    int best = 0, ans;
    for (int i = 0; i < n; i++) {
        cnt = 0;
        for (int j = 0; j < n; j++) freq[j] = bigfreq[j] = 0;
        in(i,colours[i]);
        out(0,colours[i],i);
        int swapped = 0;
        
        for (int j = depths[i]+1; j < n; j++) swapped += min(bigfreq[j], freq[j]);
        if (best == cnt+swapped) ans = min(ans, swapped);
        else if (cnt+swapped > best) {
            best = cnt+swapped;
            ans = swapped;
        }
    }
    cout << best << " " << ans << "\n";
} 
| # | 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... |