// ???????????????????????????????????????????????????????????
// ???????????????????????????????????????????????????????????
// ???????????????????????????????????????????????????????????
// ???????????????????????????????????????????????????????????
// ???????????????????????????????????????????????????????????
// ???????????????????????????????????????????????????????????
#include <bits/stdc++.h>
using namespace std;
#define F first
#define S second
#define tos to_string
#define __lcm(x, y) ((x /__gcd(x, y)) * y)
// #pragma GCC optimize ("O3,unroll-loops")
// #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#define int long long
#define abs llabs
#define all(v) v.begin(), v.end()
const int N = 2E5 + 5, M = 1E5 + 5, LOG = 30;
const int inf = 1E18, MOD = 1E9 + 7, MOD1 = 998244353;
int n, m;
vector<int>dp[1005]{};
bool memo[21][(1 << 20) + 1]{};
int a[21]{}, b[21]{};
void dfs(int i, int mask) {
if (i == n + 1) {
cout << "YES\n";
exit(0);
}
if (memo[i][mask] == 1) {
return;
}
memo[i][mask] = 1;
for(int j = 0; j < dp[a[i]].size(); j++){
int x = dp[a[i]][j];
if ((mask & x) == 0) {
dfs(i + 1, mask + x);
}
}
}
void solve() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
for (int i = 1; i <= m; i++) {
cin >> b[i];
}
for(int i = 0; i < (1 << m); i++){
int cnt = 0;
for(int j = 0; j < m; j++){
if ((i >> j) & 1){
cnt += b[j + 1];
}
}
if(cnt>1000){
continue;
}
dp[cnt].push_back(i);
}
dfs(1, 0);
cout << "NO\n";
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int ttt = 1;
// cin >> ttt;
while(ttt--) {
solve();
}
}
/*
SQUARE
*/