Problem: Consider a rooted tree. A rooted tree has one special vertex called the root. All edges are directed from the root. Vertex u is called a child of vertex v and vertex v is called a parent of vertex u if there exists a directed edge from v to u. A vertex is called a leaf if it doesn't have children and has a parent.

Let's call a rooted tree a spruce if its every non-leaf vertex has at least 3 leaf children. You are given a rooted tree, check whether it's a spruce.

The definition of a rooted tree can be found [here](https://goo.gl/1dqvzz).

Input

The first line contains one integer n — the number of vertices in the tree (3 ≤ n ≤ 1 000). Each of the next n - 1 lines contains one integer pi (1 ≤ i ≤ n - 1) — the index of the parent of the i + 1-th vertex (1 ≤ pi ≤ i).

Vertex 1 is the root. It's guaranteed that the root has at least 2 children.

Output

Print "Yes" if the tree is a spruce and "No" otherwise.

Examples

Input

4
1
1
1


Output

Yes


Input

7
1
1
1
2
2
2


Output

No


Input

8
1
1
1
1
3
3
3


Output

Yes

Note

The first example:

<image>

The second example:

<image>

It is not a spruce, because the non-leaf vertex 1 has only 2 leaf children.

The third example:

<image>

Solution (in JAVA):

Solution:
import java.util.*;
import java.io.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class Hello {
  static ArrayList<Integer> a[] = new ArrayList[3005];
  static int bad;
  static int dfs(int x, int prev)
  {
    int cnt = 0;
    int leaf = 0;
    for (int v:a[x]) {
      if (v == prev) continue;
      leaf += dfs(v, x);
      cnt += 1;
    }
    //System.out.println("x:" + x + " count:"+cnt);
    if (cnt == 0) return 1;
    if (leaf < 3) bad = 1;
    return 0;
  }
  public static void main(String[] args) {
    try {
      MScanner in = new MScanner(System.in);
      BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out, "UTF-8"));
      int n = in.nextInt();
      
      for (int i = 0; i <= n; i++) a[i] = new ArrayList<>();
      
      for (int i = 1;i <= n - 1;++i) {

	int i1 = i + 1;
	int i2 = in.nextInt();
	a[i1].add(i2);
	a[i2].add(i1);
      }
      
      dfs(1, 0);

      if (bad == 1) {
	out.write("NO\n");
      } else {
	out.write("YES\n");
      }
      out.flush(); out.close();
    } catch (Exception e){
      System.exit(0);
    }

  }
  static class MScanner {
    StringTokenizer st;
    BufferedReader br;
    public MScanner(InputStream system) {
      br = new BufferedReader(new InputStreamReader(system));
    }

    public MScanner(String file) throws Exception {
      br = new BufferedReader(new FileReader(file));
    }

    public String next() throws IOException {
      while (st == null || !st.hasMoreTokens())
	st = new StringTokenizer(br.readLine());
      return st.nextToken();
    }
    public int[] takearr(int n) throws IOException {
      int[]in=new int[n];for(int i=0;i<n;i++)in[i]=nextInt();
      return in;
    }
    public long[] takearrl(int n) throws IOException {
      long[]in=new long[n];for(int i=0;i<n;i++)in[i]=nextLong();
      return in;
    }
    public Integer[] takearrobj(int n) throws IOException {
      Integer[]in=new Integer[n];for(int i=0;i<n;i++)in[i]=nextInt();
      return in;
    }
    public Long[] takearrlobj(int n) throws IOException {
      Long[]in=new Long[n];for(int i=0;i<n;i++)in[i]=nextLong();
      return in;
    }
    public String nextLine() throws IOException {
      return br.readLine();
    }

    public int nextInt() throws IOException {
      return Integer.parseInt(next());
    }

    public double nextDouble() throws IOException {
      return Double.parseDouble(next());
    }

    public char nextChar() throws IOException {
      return next().charAt(0);
    }

    public Long nextLong() throws IOException {
      return Long.parseLong(next());
    }

    public boolean ready() throws IOException {
      return br.ready();
    }

    public void waitForInput() throws InterruptedException {
      Thread.sleep(3000);
    }
  }
}