#include <bits/stdc++.h>
using namespace std;
long long pwr(long long base, long long p, long long mod = (1000000007LL)) {
  long long ans = 1;
  while (p) {
    if (p & 1) ans = (ans * base) % mod;
    base = (base * base) % mod;
    p /= 2;
  }
  return ans;
}
long long gcd(long long a, long long b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
int n, x[5], sx[5], sxx[5];
int p[5005], sz[5005];
vector<int> adj[5005];
int dp[5005][5005];
vector<int> sizes;
vector<int> modifiedSizes;
vector<int> sub[5];
int dfs(int node) {
  if (adj[node].size() == 0) sz[node] = 1;
  for (int i = 0; i < adj[node].size(); i++) sz[node] += dfs(adj[node][i]);
  return sz[node];
}
void processNode(int id) {
  int node = x[id];
  while (node != 1) sx[id] = node, node = p[node];
  node = x[id];
  sxx[id] = node;
  while (node != sx[id]) sxx[id] = node, node = p[node];
  if (sx[id] == sxx[id]) return;
  for (int i = 0; i < adj[sx[id]].size(); i++)
    if (adj[sx[id]][i] != sxx[id]) sub[id].push_back(sz[adj[sx[id]][i]]);
}
bool Knapsack(int maxW, int extra) {
  int maxN = modifiedSizes.size();
  memset(dp, 0, sizeof(dp));
  for (int i = 0; i <= maxN; i++) dp[i][0] = 1;
  for (int i = 1; i <= maxN; i++) {
    for (int j = 1; j <= maxW; j++) {
      dp[i][j] = dp[i - 1][j];
      if (modifiedSizes[i - 1] <= j)
        dp[i][j] = dp[i][j] || dp[i - 1][j - modifiedSizes[i - 1]];
    }
  }
  for (int i = 0; i <= maxN; i++) {
    for (int j = 0; j <= extra; j++) {
      if (maxW >= j && dp[i][maxW - j]) return true;
    }
  }
  return false;
}
int main() {
  scanf("%d%d%d%d%d", &n, &x[0], &x[1], &x[2], &x[3]);
  p[1] = 0;
  for (int i = 2; i <= n; i++) {
    scanf("%d", &p[i]);
    adj[p[i]].push_back(i);
  }
  sz[1] = dfs(1);
  if (sz[1] % 2 != 0) {
    printf("NO\n");
    return 0;
  }
  processNode(0);
  processNode(1);
  processNode(2);
  processNode(3);
  for (int i = 0; i < adj[1].size(); i++)
    if (adj[1][i] != sx[0] && adj[1][i] != sx[1] && adj[1][i] != sx[2] &&
        adj[1][i] != sx[3])
      sizes.push_back(sz[adj[1][i]]);
  for (int i = 0; i < sizes.size(); i++) modifiedSizes.push_back(sizes[i]);
  for (int i = 0; i < sub[0].size(); i++) modifiedSizes.push_back(sub[0][i]);
  for (int i = 0; i < sub[1].size(); i++) modifiedSizes.push_back(sub[1][i]);
  bool ans = Knapsack(sz[1] / 2 - 1 - sz[sx[2]], sz[sxx[0]] + sz[sxx[1]] - 2);
  if (ans) {
    modifiedSizes.clear();
    for (int i = 0; i < sizes.size(); i++) modifiedSizes.push_back(sizes[i]);
    for (int i = 0; i < sub[2].size(); i++) modifiedSizes.push_back(sub[2][i]);
    for (int i = 0; i < sub[3].size(); i++) modifiedSizes.push_back(sub[3][i]);
    ans = Knapsack(sz[1] / 2 - 1 - sz[sx[1]], sz[sxx[2]] + sz[sxx[3]] - 2);
  }
  if (ans)
    printf("YES\n");
  else
    printf("NO\n");
  return 0;
}
