#include <bits/stdc++.h>
using namespace std;
namespace runzhe2000 {
int n, m, vis[5005], siz[5005], fa[5005], A, B, C, D, ban[5005], last[5005],
    ecnt;
bitset<5005> f, f_a, f_b, f_c, f_d;
struct edge {
  int next, to;
} e[5005];
void addedge(int a, int b) {
  e[++ecnt] = (edge){last[a], b};
  last[a] = ecnt;
}
void do_ban(int &x) {
  for (; fa[x] != 1; x = fa[x])
    ;
  ban[x] = 1;
}
void solve(int a, int b, int c, int d, bitset<5005> &f_a, bitset<5005> &f_b,
           bitset<5005> &f_c, bitset<5005> &f_d) {
  int siz_a = siz[a], siz_b = siz[b], siz_c = siz[c], siz_d = siz[d], ok = 0,
      tmp;
  for (int i = 1; i <= siz_a; i++)
    for (int j = 1; j <= siz_b; j++)
      if (f_a[i] && f_b[j] && (tmp = m / 2 - siz_c - (siz_a - i) - j) >= 0 &&
          f[tmp])
        ok = 1;
  if (!ok) return;
  for (int i = 1; i <= siz_c; i++)
    for (int j = 1; j <= siz_d; j++)
      if (f_c[i] && f_d[j] && (tmp = m / 2 - siz_b - (siz_c - i) - j) >= 0 &&
          f[tmp])
        ok = 0;
  if (ok) return;
  puts("YES");
  exit(0);
}
int dfs(int x) {
  if (x == A) {
    f_a.set(1);
    return 1;
  }
  if (x == B) {
    f_b.set(1);
    return 2;
  }
  if (x == C) {
    f_c.set(1);
    return 3;
  }
  if (x == D) {
    f_d.set(1);
    return 4;
  }
  int type = 0, son = 0;
  for (int i = last[x], tmp; i; i = e[i].next)
    tmp = dfs(e[i].to), tmp ? type = tmp, son = e[i].to : 0;
  if (!type || x == 1) return 0;
  for (int i = last[x]; i; i = e[i].next) {
    int y = e[i].to;
    if (y == son) continue;
    switch (type) {
      case 1:
        f_a |= (f_a << siz[y]);
        break;
      case 2:
        f_b |= (f_b << siz[y]);
        break;
      case 3:
        f_c |= (f_c << siz[y]);
        break;
      case 4:
        f_d |= (f_d << siz[y]);
        break;
    }
  }
  return type;
}
void main() {
  scanf("%d%d%d%d%d", &n, &A, &B, &C, &D);
  m = n;
  for (int i = 2; i <= n; i++)
    scanf("%d", &fa[i]), !vis[fa[i]] ? vis[fa[i]] = 1, m-- : 0,
                                       addedge(fa[i], i);
  for (int i = n; i >= 2; i--)
    siz[i] += (!vis[i] ? 1 : 0), siz[fa[i]] += siz[i];
  if (m & 1) {
    puts("NO");
    return;
  }
  dfs(1);
  do_ban(A);
  do_ban(B);
  do_ban(C);
  do_ban(D);
  f.set(0);
  for (int i = 2; i <= n; i++)
    if (fa[i] == 1 && !ban[i]) f |= (f << siz[i]);
  solve(A, B, C, D, f_a, f_b, f_c, f_d);
  solve(B, A, C, D, f_b, f_a, f_c, f_d);
  solve(A, B, D, C, f_a, f_b, f_d, f_c);
  solve(B, A, D, C, f_b, f_a, f_d, f_c);
  puts("NO");
}
}  // namespace runzhe2000
int main() { runzhe2000::main(); }
