voiddfs1(int x){ siz[x] = 1; for (int i = head[x]; i; i = pre[i]) { int y = to[i]; if (y == fa[x]) continue; fa[y] = x; d[y] = d[x] + 1; dfs1(y); siz[x] += siz[y]; if (!son[x] || siz[son[x]] < siz[y]) son[x] = y; } }
voidcalc(int x, int tp){ for (int i = 0; i <= 21; i++) { buc[a[x]&two[i]][i] += tp; } for (int i = head[x]; i; i = pre[i]) { if (to[i] != fa[x]) calc(to[i], tp); } }
voidgetans(int x){ for (int i = head[x]; i; i = pre[i]) { if (to[i] != fa[x]) ans[x] ^= ans[to[i]]; } for (int i = 0; i <= 21; i++) { ans[x] ^= ((buc[d[x]&two[i]][i] & 1) << i); } ans[x] ^= (a[x] - d[x]); }
voiddfs(int x, int cl){ for (int i = head[x]; i; i = pre[i]) { if (to[i] == fa[x] || to[i] == son[x]) continue; dfs(to[i], 1); } if (son[x]) dfs(son[x], 0); for (int i = head[x]; i; i = pre[i]) { if (to[i] == fa[x] || to[i] == son[x]) continue; calc(to[i], 1); } getans(x); if (cl) { for (int i = head[x]; i; i = pre[i]) { if (to[i] == fa[x]) continue; calc(to[i], -1); } } else { for (int i = 0; i <= 21; i++) { buc[a[x]&two[i]][i]++; } } }
intmain(){ read(n); for (int i = 1; i <= n; i++) read(a[i]); for (int i = 2, x; i <= n; i++) { read(x); addedge(i, x); } for (int i = 0; i <= 21; i++) two[i] = (1 << i) - 1; dfs1(1); for (int i = 1; i <= n; i++) a[i] += d[i]; dfs(1, 0); for (int i = 1; i <= n; i++) { Ans += ans[i]; } printf("%lld\n", Ans); return0; }