Problem:
Score : 600 points

Problem Statement

We have one slime.

You can set the health of this slime to any integer value of your choice.

A slime reproduces every second by spawning another slime that has strictly less health. You can freely choose the health of each new slime. The first reproduction of our slime will happen in one second.

Determine if it is possible to set the healths of our first slime and the subsequent slimes spawn so that the multiset of the healths of the 2^N slimes that will exist in N seconds equals a multiset S.

Here S is a multiset containing 2^N (possibly duplicated) integers: S_1,~S_2,~...,~S_{2^N}.

Constraints

All values in input are integers.

1 \leq N \leq 18

1 \leq S_i \leq 10^9

Input

Input is given from Standard Input in the following format:

N
S_1 S_2 ... S_{2^N}

Output

If it is possible to set the healths of the first slime and the subsequent slimes spawn so that the multiset of the healths of the 2^N slimes that will exist in N seconds equals S, print Yes; otherwise, print No.

Sample Input 1

2
4 2 3 1

Sample Output 1

Yes

We will show one way to make the multiset of the healths of the slimes that will exist in 2 seconds equal to S.

First, set the health of the first slime to 4.

By letting the first slime spawn a slime whose health is 3, the healths of the slimes that exist in 1 second can be 4,~3.

Then, by letting the first slime spawn a slime whose health is 2, and letting the second slime spawn a slime whose health is 1, the healths of the slimes that exist in 2 seconds can be 4,~3,~2,~1, which is equal to S as multisets.

Sample Input 2

2
1 2 3 1

Sample Output 2

Yes

S may contain multiple instances of the same integer.

Sample Input 3

1
1 1

Sample Output 3

No

Sample Input 4

5
4 3 5 3 1 2 7 8 7 4 6 3 7 2 3 6 2 7 3 2 6 7 3 4 6 7 3 4 2 5 2 3

Sample Output 4

No

Solution in C# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Collections;
using System.Collections.Specialized;
using System.Linq;
using System.Text;
using System.IO;
using System.Reflection;
using static System.Math;
using System.Numerics;
static class Program{
	const int mod=(int)1e9+7;
	static void Main(){
		Sc sc=new Sc();
		var n=sc.I;
		var a=sc.Ia;
		var avl=new Avl();
		var qu=new Queue<int>();
		var m=a.Length;
		var ans="Yes";
		for(int i = 0;i<m;i++) {avl.Ud(a[i]);}
		qu.Enqueue(avl.Ra(avl.cnt).n);
		avl.Dl(qu.Peek());
		while(avl.cnt>0){
			var e=qu.Dequeue();
			var p=avl.Ub(e-1);
			if(p==null){ans="No";break;}
			avl.Dl(p.n);
			qu.Enqueue(e);
			qu.Enqueue(p.n);
		}
		Console.WriteLine("{0}",ans);
	}
}
public class Avl{
	public class Nd{
		public int h=1,c=1;
		public readonly int n;
		public Nd l,r;
		public Nd(int n,Nd l,Nd r){this.n=n;this.l=l;this.r=r;}
	}
	public Nd root,du;
	public int cnt=0;
	public Avl(){
		du=new Nd(int.MinValue,du,du);du.h=0;du.c=0;
		root=du;
	}
	public void Ud(int n){
		Nd mn=new Nd(n,du,du);
		if(root==du){root=mn;}
		else{
			Fu(root,n,mn);
			if(Abs(root.l.h-root.r.h)>1){root=Rotate(root);}
		}
		cnt++;
	}
	private void Fu(Nd t,int n,Nd mn){
		t.c++;
		if(t.n>n){
			if(t.l!=du){
				Fu(t.l,n,mn);
				if(Abs(t.l.l.h-t.l.r.h)>1){t.l=Rotate(t.l);}
			}
			else{t.l=mn;}
		}
		else{
			if(t.r!=du){
				Fu(t.r,n,mn);
				if(Abs(t.r.l.h-t.r.r.h)>1){t.r=Rotate(t.r);}
			}
			else{t.r=mn;}
		}
		t.h=Max(t.l.h,t.r.h)+1;
	}
	private Nd Rotate(Nd t){
		Nd nd=du;
		if(t.l.h>t.r.h){
			if(t.l.l.h>t.l.r.h){
				nd=t.l;t.l=t.l.r;nd.r=t;
				t.h=Max(t.l.h,t.r.h)+1;
				t.c=t.l.c+t.r.c+1;
			}
			else{
				nd=t.l.r;
				t.l.r=nd.l;nd.l=t.l;
				t.l.h=Max(t.l.l.h,t.l.r.h)+1;
				t.l.c=t.l.l.c+t.l.r.c+1;
				t.l=nd.r;nd.r=t;
				t.h=Max(t.l.h,t.r.h)+1;
				t.c=t.l.c+t.r.c+1;
			}
		}
		else{
			if(t.r.l.h>t.r.r.h){
				nd=t.r.l;
				t.r.l=nd.r;nd.r=t.r;
				t.r.h=Max(t.r.l.h,t.r.r.h)+1;
				t.r.c=t.r.l.c+t.r.r.c+1;
				t.r=nd.l;nd.l=t;
				t.h=Max(t.l.h,t.r.h)+1;
				t.c=t.l.c+t.r.c+1;
			}
			else{
				nd=t.r;t.r=t.r.l;nd.l=t;
				t.h=Max(t.l.h,t.r.h)+1;
				t.c=t.l.c+t.r.c+1;
			}
		}
		nd.h=Max(nd.l.h,nd.r.h)+1;
		nd.c=nd.l.c+nd.r.c+1;
		return nd;
	}
	public bool Dl(int n){
		Nd t=root;
		if(t.n==n){
			root=Fd2(root);
			if(cnt==0){return true;}
			else if(Abs(root.l.h-root.r.h)>1){root=Rotate(root);}
			else{
				root.h=Max(root.l.h,root.r.h)+1;
				root.c=root.l.c+root.r.c+1;
			}
			return true;
		}
		bool bo=Fd1(root,n);
		if(Abs(root.l.h-root.r.h)>1){root=Rotate(root);}
		else{
			root.h=Max(root.l.h,root.r.h)+1;
			root.c=root.l.c+root.r.c+1;
		}
		return bo;
	}
	private bool Fd1(Nd t,int n){
		if(t.n>n){
			if(t.l==du){return false;}
			else if(t.l.n!=n){
				bool bo=Fd1(t.l,n);
				if(Abs(t.l.l.h-t.l.r.h)>1){t.l=Rotate(t.l);}
				else{
					t.l.h=Max(t.l.l.h,t.l.r.h)+1;
					t.l.c=t.l.l.c+t.l.r.c+1;
				}
				return bo;
			}
			else{
				t.l=Fd2(t.l);
				t.h=Max(t.l.h,t.r.h)+1;
				t.c=t.l.c+t.r.c+1;
				return true;
			}
		}
		else{
			if(t.r==du){return false;}
			else if(t.r.n!=n){
				bool bo=Fd1(t.r,n);
				if(Abs(t.r.l.h-t.r.r.h)>1){t.r=Rotate(t.r);}
				else{
					t.r.h=Max(t.r.l.h,t.r.r.h)+1;
					t.r.c=t.r.l.c+t.r.r.c+1;
				}
				return bo;
			}
			else{
				t.r=Fd2(t.r);
				t.h=Max(t.l.h,t.r.h)+1;
				t.c=t.l.c+t.r.c+1;
				return true;
			}
		}
	}
	private Nd Fd2(Nd dn){
		cnt--;
		if(dn.l==du){return dn.r;}
		if(dn.r==du){return dn.l;}
		Nd u=dn.l;
		if(u.r==du){
			u.r=dn.r;
			u.h=Max(u.l.h,u.r.h)+1;
			u.c=u.l.c+u.r.c+1;
			return u;
		}
		u=Fd3(u,dn);
		if(Abs(dn.l.l.h-dn.l.r.h)>1){u.l=Rotate(dn.l);}
		else{
			dn.l.h=Max(dn.l.l.h,dn.l.r.h)+1;
			dn.l.c=dn.l.l.c+dn.l.r.c+1;
		}
		u.h=Max(u.l.h,u.r.h)+1;
		u.c=u.l.c+u.r.c+1;
		return u;
	}
	private Nd Fd3(Nd u,Nd dn){
		if(u.r.r!=du){
			Nd v=Fd3(u.r,dn);
			if(Abs(u.r.l.h-u.r.r.h)>1){u.r=Rotate(u.r);}
			else{
				u.r.h=Max(u.r.l.h,u.r.r.h)+1;
				u.r.c=u.r.l.c+u.r.r.c+1;
			}
			return v;
		}
		else{
			Nd v=u.r;u.r=u.r.l;v.l=dn.l;v.r=dn.r;
			return v;
		}
	}
	public bool Hs(int n){
		Nd t=root;
		if(cnt==0){return false;}
		if(t.n==n){return true;}
		bool bo=false;
		while(true){
			if(t.n>n){
				if(t.l==du){break;}
				else if(t.l.n!=n){t=t.l;}
				else{bo=true;break;}
			}
			else{
				if(t.r==du){break;}
				else if(t.r.n!=n){t=t.r;}
				else{bo=true;break;}
			}
		}
		return bo;
	}
	public Nd Ra(int n){return cnt>=n?Fr(root,n):null;}
	private Nd Fr(Nd t,int n){
		if(t.l.c>n-1){return Fr(t.l,n);}
		if(t.l.c<n-1){return Fr(t.r,n-t.l.c-1);}
		return t;
	}
	public Nd Lb(int n){return cnt!=0?Flb(root,n):null;}
	private Nd Flb(Nd t,int n){
		if(t.n<n){
			if(t.r==du){return null;}
			return Flb(t.r,n);
		}
		if(t.n>n){
			if(t.l==du){return t;}
			Nd u=Flb(t.l,n);
			return u==null?t:u;
		}
		return t;
	}
	public Nd Ub(int n){return cnt!=0?Fub(root,n):null;}
	private Nd Fub(Nd t,int n){
		if(t.n>n){
			if(t.l==du){return null;}
			return Fub(t.l,n);
		}
		if(t.n<n){
			if(t.r==du){return t;}
			Nd u=Fub(t.r,n);
			return u==null?t:u;
		}
		return t;
	}
	public int Rg(int a,int b){return cnt!=0?Frg(root,a,b,false,false):0;}
	private int Frg(Nd t,int a,int b,bool l,bool r){
		if(t.h==0){return 0;}
		if(l&&r){return t.c;}
		if(t.n<a){return Frg(t.r,a,b,t.n>=a,r);}
		if(t.n>b){return Frg(t.l,a,b,l,t.n<=b);}
		return Frg(t.l,a,b,l,t.n<=b)+Frg(t.r,a,b,t.n>=a,r)+1;
	}
}

public class Sc{
	public int I{get{return int.Parse(Console.ReadLine());}}
	public long L{get{return long.Parse(Console.ReadLine());}}
	public double D{get{return double.Parse(Console.ReadLine());}}
	public string S{get{return Console.ReadLine();}}
	public int[] Ia{get{return Array.ConvertAll(Console.ReadLine().Split(),int.Parse);}}
	public long[] La{get{return Array.ConvertAll(Console.ReadLine().Split(),long.Parse);}}
	public double[] Da{get{return Array.ConvertAll(Console.ReadLine().Split(),double.Parse);}}
	public string[] Sa{get{return Console.ReadLine().Split();}}
	public object[] Oa{get{return Console.ReadLine().Split();}}
	public int[] Ia2{get{return Array.ConvertAll(("0 "+Console.ReadLine()+" 0").Split(),int.Parse);}}
	public int[] Ia3(int a){return Array.ConvertAll((a.ToString()+" "+Console.ReadLine()).Split(),int.Parse);}
	public int[] Ia3(bool a,int b,bool c,int d){return Array.ConvertAll(((a?b.ToString()+" ":"")+Console.ReadLine()+(c?" "+d.ToString():"")).Split(),int.Parse);}
	public long[] La2{get{return Array.ConvertAll(("0 "+Console.ReadLine()+" 0").Split(),long.Parse);}}
	public long[] La3(int a){return Array.ConvertAll((a.ToString()+" "+Console.ReadLine()).Split(),long.Parse);}
	public long[] La3(bool a,int b,bool c,int d){return Array.ConvertAll(((a?b.ToString()+" ":"")+Console.ReadLine()+(c?" "+d.ToString():"")).Split(),long.Parse);}
	public T[] Arr<T>(int n,Func<T> f){var a=new T[n];for(int i=0;i<n;i++){a[i]=f();}return a;}
	public T[] Arr<T>(int n,Func<int,T> f){var a=new T[n];for(int i=0;i<n;i++){a[i]=f(i);}return a;}
	public T[] Arr<T>(int n,Func<string[],T> f){var a=new T[n];for(int i=0;i<n;i++){a[i]=f(Console.ReadLine().Split());}return a;}
	public T[] Arr<T>(int n,Func<int,string[],T> f){var a=new T[n];for(int i=0;i<n;i++){a[i]=f(i,Console.ReadLine().Split());}return a;}
}