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.*;
import java.util.*;


public class cf
{

	static ArrayList<Integer>ar[];

	static boolean visited[];

	static HashMap<Integer,Integer>leaf;


	static ArrayList<Integer>nonleaf;

	static int count;


	



	


	public static void main(String args[])
	{

		Scanner s=new Scanner(System.in);

		HashMap<Integer,Integer>hm=new HashMap<Integer,Integer>();


		leaf=new HashMap<Integer,Integer>();

		

		nonleaf=new ArrayList<Integer>();




		int n=s.nextInt();


		ar=new ArrayList[n+1];
		visited=new boolean[n+1];

		for(int i=1;i<=n;i++)
		{
			ar[i]=new ArrayList<>();
		}

		for(int i=2;i<=n;i++)
		{

			int a=s.nextInt();

			ar[a].add(i);

			ar[i].add(a);

		}


		 dfs(1);

		

		 for( int ans : nonleaf)
		 {



		 	if(!leaf.containsKey(ans))
		 	{

		 		System.out.println("No");

		 		System.exit(0);
		 	}

		 	else if(leaf.get(ans)<3)
		 	{

		 		System.out.println("No");

		 		System.exit(0);
		 	}
		 }


		 System.out.println("Yes");









		 // for(Map.Entry<Integer,Integer> entry :  leaf.entrySet())
		 // {

		 // 	if(entry.getValue()<3)
		 // 	{

		 // 		System.out.println("No");

		 // 		System.exit(0);
		 // 	}
		 // }


		 // System.out.println("Yes");




		 

		 



}


		

	

		static void dfs(int vertex)
		{



			visited[vertex]=true;

			

			
			
			for(int k : ar[vertex])
			{


				
				if(!visited[k])
				{



					if(ar[k].size()==1)
					{
							

						int count=leaf.containsKey(vertex) ? leaf.get(vertex) : 0;

						leaf.put(vertex,count+1);
					}



					
					dfs(k);

				}
			}


			if(ar[vertex].size()!=1)
			{

				nonleaf.add(vertex);



			}


			
		}
	}