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.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Christmas_Spruce {
	 public static void main(String[]args) throws IOException {
		 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		 
//	        String[] input = br.readLine().split(" ");
		 int n = Integer.parseInt(br.readLine());
		 
		 boolean [][]adjMat = new boolean[1005][1005];
		 for (int i = 1; i < n; i++) {
			 int x=Integer.parseInt(br.readLine());
			 adjMat[x][i+1]=true;
		 }
		 boolean []isLeaf=new boolean[1005];
		 boolean [][]check=new boolean [1005][1005];
//		 Arrays.fill(check[0], true);
//		 Arrays.fill(check[1], false);
//		 System.out.println(Arrays.deepToString(adjMat));
		 for(int i=0;i<adjMat.length;i++) {
			 boolean leaf=true;
			 for(int j=0;j<adjMat.length;j++) {
				 if(adjMat[i][j]==true) {
					 leaf=false;
					 break;
				 }
			 }
			 isLeaf[i]=leaf;
		 }
//		 System.out.println(Arrays.toString(isLeaf));
		 boolean flag=true;
		 for(int i=0;i<adjMat.length;i++) {
			 int cnt=0;
			 for(int j=0;j<adjMat[i].length;j++) {
				 if(adjMat[i][j]==true) {
					 if(isLeaf[j]==true) {
						 cnt++;
					 }
				 }
			 }
//			 System.out.println(cnt);
			 if(!isLeaf[i] & cnt==0)
				 flag=false;
			 if(cnt<3 & cnt!=0)
				 flag=false;
		 }
		 if(flag)
			 System.out.println("Yes");
		 else
			 System.out.println("No");
//		 System.out.println(Arrays.toString(check[1]));
	 }
}