#include <bits/stdc++.h>
using namespace std;
const int iinf = 1e9 + 7;
const long long linf = 1ll << 60;
const double dinf = 1e60;
template <typename T>
inline void scf(T &x) {
  bool f = 0;
  x = 0;
  char c = getchar();
  while ((c < '0' || c > '9') && c != '-') c = getchar();
  if (c == '-') {
    f = 1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    x = x * 10 + c - '0';
    c = getchar();
  }
  if (f) x = -x;
  return;
}
template <typename T1, typename T2>
void scf(T1 &x, T2 &y) {
  scf(x);
  return scf(y);
}
template <typename T1, typename T2, typename T3>
void scf(T1 &x, T2 &y, T3 &z) {
  scf(x);
  scf(y);
  return scf(z);
}
template <typename T1, typename T2, typename T3, typename T4>
void scf(T1 &x, T2 &y, T3 &z, T4 &w) {
  scf(x);
  scf(y);
  scf(z);
  return scf(w);
}
inline char mygetchar() {
  char c = getchar();
  while (c == ' ' || c == '\n') c = getchar();
  return c;
}
template <typename T>
void chkmax(T &x, const T &y) {
  if (y > x) x = y;
  return;
}
template <typename T>
void chkmin(T &x, const T &y) {
  if (y < x) x = y;
  return;
}
void TZL();
void RANK1();
int main() {
  TZL();
  RANK1();
  return 0;
}
const int N = 5050;
int n, m;
int a, b, c, d;
int siz[N], dfn[N], End[N], par[N];
bool fa[N], fb[N], fc[N], fd[N];
bool f1[N], f2[N], dp[N];
void solve(int u, bool *f) {
  memset((f), (0), sizeof((f)));
  f[0] = 1;
  for (int i = (1), _end_ = (n); i <= _end_; ++i)
    if (par[i] != 1 && !(dfn[i] <= dfn[u] && dfn[u] <= End[i]) &&
        (dfn[par[i]] <= dfn[u] && dfn[u] <= End[par[i]]))
      for (int j = (n), _end_ = (siz[i]); j >= _end_; --j)
        f[j] |= f[j - siz[i]];
  return;
}
void TZL() {
  static int sz[N];
  memset((sz), (0), sizeof((sz)));
  scf(n);
  scf(a, b, c, d);
  for (int i = (2), _end_ = (n); i <= _end_; ++i) {
    scf(par[i]);
    siz[i] = sz[i] = 1;
    siz[par[i]] = 0;
  }
  for (int i = (n), _end_ = (1); i >= _end_; --i)
    siz[par[i]] += siz[i], sz[par[i]] += sz[i];
  if ((m = siz[1]) & 1) {
    puts("NO");
    exit(0);
  } else
    m >>= 1;
  for (int i = (1), _end_ = (n); i <= _end_; ++i)
    End[i] = dfn[i] = End[par[i]] + 1, End[par[i]] += sz[i];
  for (int i = (2), _end_ = (n); i <= _end_; ++i)
    assert(dfn[par[i]] <= dfn[i] && dfn[i] <= End[par[i]]);
  return;
}
void RANK1() {
  solve(a, fa);
  solve(b, fb);
  solve(c, fc);
  solve(d, fd);
  for (int i = (0), _end_ = (m); i <= _end_; ++i)
    for (int j = (0), _end_ = (i); j <= _end_; ++j)
      f1[i] |= (fa[j] & fb[i - j]);
  for (int i = (0), _end_ = (m); i <= _end_; ++i)
    for (int j = (0), _end_ = (i); j <= _end_; ++j)
      f2[i] |= (fc[j] & fd[i - j]);
  dp[0] = 1;
  for (int i = (1), _end_ = (n); i <= _end_; ++i)
    if (par[i] == 1 && !(dfn[i] <= dfn[a] && dfn[a] <= End[i]) &&
        !(dfn[i] <= dfn[b] && dfn[b] <= End[i]) &&
        !(dfn[i] <= dfn[c] && dfn[c] <= End[i]) &&
        !(dfn[i] <= dfn[d] && dfn[d] <= End[i]))
      for (int j = (m), _end_ = (siz[i]); j >= _end_; --j)
        dp[j] |= dp[j - siz[i]];
  int sb, sc;
  for (int i = (1), _end_ = (n); i <= _end_; ++i) {
    if (par[i] == 1 && dfn[i] <= dfn[b] && dfn[b] <= End[i]) sb = siz[i];
    if (par[i] == 1 && dfn[i] <= dfn[c] && dfn[c] <= End[i]) sc = siz[i];
  }
  bool ok1 = 0, ok2 = 0;
  for (int i = 0, _end_ = (m - sc); i < _end_; ++i)
    ok1 |= (dp[i] & f1[m - 1 - i - sc]);
  for (int i = 0, _end_ = (m - sb); i < _end_; ++i)
    ok2 |= (dp[i] & f2[m - 1 - i - sb]);
  puts((ok1 && ok2) ? "YES" : "NO");
  return;
}
