#include <bits/stdc++.h>
using namespace std;
template <class S, class T>
ostream& operator<<(ostream& o, const pair<S, T>& p) {
  return o << "(" << p.first << "," << p.second << ")";
}
template <class T>
ostream& operator<<(ostream& o, const vector<T>& vc) {
  o << "sz = " << vc.size() << endl << "[";
  for (const T& v : vc) o << v << ",";
  o << "]";
  return o;
}
int N, A, B, C, D, M;
const int MN = 5000;
int p[MN];
vector<int> G[MN];
int sz[MN];
bool dp[MN + 1][MN + 1];
int getr(int v) {
  while (p[v] != 0) v = p[v];
  return v;
}
vector<int> calcA(int A) {
  vector<int> as;
  while (p[A] != 0) {
    int x = p[A];
    for (int u : G[x])
      if (u != A) as.push_back(sz[u]);
    A = p[A];
  }
  bool ok[MN + 1] = {};
  ok[0] = 1;
  for (int a : as) {
    for (int i = N; i >= 0; i--)
      if (ok[i]) ok[i + a] = 1;
  }
  vector<int> ret;
  for (int i = 0; i < (int)(N + 1); i++)
    if (ok[i]) ret.push_back(i);
  return ret;
}
bool solve() {
  vector<int> as = calcA(A);
  vector<int> bs = calcA(B);
  vector<int> cs = calcA(C);
  vector<int> ds = calcA(D);
  vector<int> rs;
  for (int i = 0; i < (int)(N); i++)
    if (p[i] == 0) {
      rs.push_back(i);
    }
  int R = rs.size();
  int rA = getr(A), rB = getr(B), rC = getr(C), rD = getr(D);
  {
    for (int i = 0; i < (int)(R + 1); i++)
      for (int j = 0; j < (int)(M + 1); j++) dp[i][j] = 0;
    dp[0][0] = 1;
    for (int i = 0; i < (int)(R); i++)
      for (int j = 0; j < (int)(M + 1); j++)
        if (dp[i][j]) {
          int r = rs[i];
          if (r == rA) {
            for (int a : as) {
              dp[i + 1][j + (sz[r] - a)] = 1;
            }
          } else if (r == rB) {
            for (int b : bs) {
              dp[i + 1][j + b] = 1;
            }
          } else if (r == rC) {
            dp[i + 1][j + sz[r]] = 1;
          } else if (r == rD) {
            dp[i + 1][j] = 1;
          } else {
            dp[i + 1][j] = 1;
            dp[i + 1][j + sz[r]] = 1;
          }
        }
    if (!dp[R][M / 2]) return 0;
  }
  {
    for (int i = 0; i < (int)(R + 1); i++)
      for (int j = 0; j < (int)(M + 1); j++) dp[i][j] = 0;
    dp[0][0] = 1;
    for (int i = 0; i < (int)(R); i++)
      for (int j = 0; j < (int)(M + 1); j++)
        if (dp[i][j]) {
          int r = rs[i];
          if (r == rC) {
            for (int a : cs) {
              dp[i + 1][j + (sz[r] - a)] = 1;
            }
          } else if (r == rD) {
            for (int b : ds) {
              dp[i + 1][j + b] = 1;
            }
          } else if (r == rB) {
            dp[i + 1][j + sz[r]] = 1;
          } else if (r == rA) {
            dp[i + 1][j] = 1;
          } else {
            dp[i + 1][j] = 1;
            dp[i + 1][j + sz[r]] = 1;
          }
        }
    if (!dp[R][M / 2]) return 0;
  }
  return 1;
}
bool can() {
  cin >> N;
  cin >> A >> B >> C >> D;
  A--, B--, C--, D--;
  for (int i = 0; i < (int)(N - 1); i++) {
    int x;
    cin >> x;
    x--;
    p[i + 1] = x;
    G[x].push_back(i + 1);
  }
  p[0] = -1;
  for (int i = N - 1; i >= 0; i--) {
    if (sz[i] == 0) sz[i] = 1, M++;
    if (i) sz[p[i]] += sz[i];
  }
  if (M % 2 == 1) return 0;
  if (solve()) return 1;
  swap(C, D);
  if (solve()) return 1;
  return 0;
}
int main() {
  if (can())
    puts("YES");
  else
    puts("NO");
}
