#include <bits/stdc++.h>
 
#include <ext/pb_ds/assoc_container.hpp> // Common file
#include <ext/pb_ds/tree_policy.hpp> // Including tree_order_statistics_node_update
using namespace __gnu_pbds;
using namespace std;
#define int long long
//for set
// typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;   
// for multiset
typedef tree<
pair<int, int>,
null_type,
less<pair<int, int>>,
rb_tree_tag,
tree_order_statistics_node_update> ordered_multiset;
 
 
#define ff first
#define ss second
#define endl "\n"
#define all(x) (x).begin(), (x).end()
// #define PI 3.1415926535897932384626433832795
#define PI acos(-1.0)
int MOD=1e9+7;
int powmod(int a,int l, int md){int res=1;while(l){if(l&1)res=res*a%md;l/=2;a=a*a%md;}return res;}
typedef long long ll; typedef vector<ll> vi; typedef pair<ll, ll> ii; typedef vector<ii> vii;
#define pb push_back
int __set(int b, int i) {return b|(1<<i);} //set ith bit
int __unset(int b, int i) {return b&!(1<<i);}
int __check(int b, int i) {return b&(1<<i);} //returns 0 if ith bit is 0
int mul(int a, int b) {return ((a%MOD)*(b%MOD))%MOD;}
int add(int a, int b) {return (a+b)%MOD;}
int sub(int a, int b) {return (((a-b)%MOD)+MOD)%MOD;}
int __div(int a, int b) {return mul(a, powmod(b, MOD-2, MOD));} //if MOD is prime;
const ll inf = 0xFFFFFFFFFFFFFFFL; //very large number
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>> > pq; //for min priority_queue
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
clock_t time_p=clock();
void time()
{
    time_p=clock()-time_p;
    cerr<<"Time Taken : "<<(float)(time_p)/CLOCKS_PER_SEC<<"\n";
}
 
// map<char, int> m;
// bool cmp(char a, char b) {
// 	return m[a]<m[b];
// }
int n;
bool solve(multiset<int>& s1, multiset<int>& s2, int ti) {
	// cout<<n<<" "<<ti<<" "<<s1.size()<<" "<<s2.size()<<endl;
	if(ti==n) {
		// cout<<"dsd "<<s2.size()<<endl;
		if(s2.size()==0ll) {
			// cout<<"in1"<<endl;
			return true;
		}
		// cout<<"in2"<<end	l;
		return false;
	}
	multiset<int> s3;
	multiset<int> s4;
	for(auto it = s2.rbegin(); it != s2.rend(); it++) {
		auto tmp = s1.upper_bound(*it);
		if(tmp != s1.end()) {
			s3.insert(*it); s3.insert(*tmp);
			s1.erase(tmp);
		} else {
			s4.insert(*it);
		}
	}
	for(auto it = s1.begin(); it != s1.end(); it++) s3.insert(*it);
	return solve(s3, s4, ti+1);
}
int32_t main(void)
{
	IOS;
	// int n, d, e; cin>>n>>d>>e;
	// e*=5;
	// vector<bool> reach(1e8+10, false);
	// reach[0]=true;
	// // reach[d]=true; reach[e]=true;
	// for(int i = 0; i < n; i++) {
	// 	if(reach[i] && i+d  <= n)
	// 		reach[i+d]=true;
	// 	if(reach[i] && i+e <= n)
	// 		reach[i+e]=true;
	// }
	// for(int i = n; i >= 0; i--) {
	// 	if(reach[i]) {
	// 		cout<<n-i<<endl;
	// 		return 0;
	// 	}
	// }
 
	// int b,g,n; cin>>b>>g>>n;
	// int cnt;
	// for(int i = 0; i <= min(n, b); i++) {
	// 	int bb=i; int gg = n-bb;
	// 	if(gg > g) continue;
	// 	cnt++;
	// }
	// cout<<cnt<<endl;
 
	// int n; cin>>n;
	// string s;  cin>>s;
	// int cnt1=0; int cnt2=0;
	// for(int i = 0; i < n; i++) {
	// 	if(s[i]=='(') cnt1++;
	// 	else cnt2++;
	// }
	// if(cnt1!=cnt2) {
	// 	cout<<"No"<<endl;
	// 	return 0;
	// }
	// stack<int> st;
	// int unmatched=0;
	// for(int i = 0; i < n; i++) {
	// 	if(s[i]=='(') st.push(i);
	// 	else if(st.empty()) unmatched++;
	// 	else st.pop();
	// }
	// while(!st.empty()) {
	// 	unmatched++; st.pop();
	// }
	// if(unmatched==2 || !unmatched) cout<<"Yes"<<endl;
	// else cout<<"No"<<endl;
 
	// int n; cin>>n;
	// vi a(n);
	// for(int i = 0;i < n; i++)
	// 	cin>>a[i];
	// stack<int> s;
	// vi left(n, -1); vi right(n, -1);
	// s.push(0);
	// for(int i = 1; i < n; i++) {
	// 	if(s.empty()) {
	// 		s.push(i);
	// 	} else {
	// 		int tmp=s.top();
	// 		if(a[tmp] < a[i]) {
	// 			while(!s.empty()) {
	// 				tmp=s.top();
	// 				if(a[tmp] < a[i]) {
	// 					right[tmp]=i; s.pop();
	// 				} else
	// 					break;
	// 			}
	// 			s.push(i);
	// 		}
	// 		else s.push(i);
	// 	}
	// }
	// for(int i: right) cout<<i<<" ";
	// 	cout<<endl;
	// stack<int> st;
	// st.push(n-1);
	// for(int i = n-2; i >= 0; i--) {
	// 	if(st.empty()) {
	// 		st.push(i);
	// 		continue;
	// 	} else {
	// 		int tmp=st.top();
	// 		if(a[tmp] < a[i]) {
	// 			while(!st.empty()) {
	// 				tmp=st.top();
	// 				if(a[tmp] < a[i]) {
	// 					left[tmp]=i; st.pop();
	// 				} else
	// 					break;
	// 			}
	// 			st.push(i);
	// 		} else st.push(i);
	// 	}
	// }
	// for(int i: left) cout<<i<<" ";
	// 	cout<<endl;
	// for(int i: right) cout<<i<<" ";
	// 	cout<<endl;
	// int sum=0;
	// for(int i = 0; i < n;i++) {
	// 	int lft1=0, lft2=0, rt1=0, rt2=0;
	// 	if(left[i]==-1) {
	// 		lft1=i+1; lft2=0;
	// 	} else {
	// 		lft1=i-left[i];
	// 		if(left[left[i]]==-1) {
	// 			lft2=left[i]+1;
	// 		} else {
	// 			lft2=left[i]-left[left[i]]+1;
	// 		}
	// 	}
	// 	if(right[i]==-1) {
	// 		rt1=n-i; rt2=0;
	// 	} else {
	// 		rt1=right[i]-i;
	// 		if(right[right[i]]==-1) {
	// 			rt2=n-right[i];
	// 		} else {
	// 			rt2=right[right[i]]-right[i];
	// 		}
	// 	}
	// 	cout<<i<<" "<<lft1<<" "<<lft2<<" "<<rt1<<" "<<rt2<<endl;
	// 	cout<<((lft1*rt2)+(lft2*rt1))<<endl;
	// 	sum += ((lft1*rt2)+(lft2*rt1))*a[i];
	// }
	// cout<<sum<<endl;
 
	cin>>n;
	// cout<<n<<endl;
	int m = 1<<n;
	// cout<<m<<endl;
	vi a(m);
	for(int i = 0; i < m; i++) cin>>a[i];
		// cout<<"nxt"<<endl;
	sort(all(a));
	multiset<int> s1; s1.insert(a[m-1]);
	multiset<int> s2;
	for(int i = 0; i < m-1; i++) {
		s2.insert(a[i]);
	}
	if(solve(s1,s2,0)) cout<<"Yes"<<endl;
	else cout<<"No"<<endl;
   	time();
	return 0;
}

Measured memory_bytes: 223488