/*
从n个数中取出四次,看他们的结果可不可能是m,若果可能就输出Yes,
否则计数No。
*/
# include<iostream>
# include<algorithm>
using namespace std;
# define MAX_N 1000
int main()
{
bool flag;
int n,m,k[MAX_N];
while(cin>>n>>m)
{
flag=false;
for(int i=0;i<n;i++)
cin>>k[i];
for(int a=0;a<n&&!flag;a++)
for(int b=0;b<n&&!flag;b++)
for(int c=0;c<n&&!flag;c++)
for(int d=0;d<n&&!flag;d++)
if(k[a]+k[b]+k[c]+k[d]==m)
flag=true;
if(flag)
cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}
# if 0
/*
k1+k2+k3+k4=m转化为k1=m-k2-k3-k4,搜索里面的k1的值是否存在。11
*/
# include <iostream>
# include <algorithm>
# define MAX_N 1000
using namespace std;
int n,m,k[MAX_N];
bool binary_search(int x)
{
int l=0,r=n;
while(r-l>=1)
{
int i=(l+r)/2;
if(k[i]==x) return true;
else if(k[i]<x) l=i+1;
else r=i;
}
return false;
}
void solve()
{
sort(k,k+n);
bool f=false;
for(int a=0;a<n;a++)
{for(int b=0;b<n;b++)
{for(int c=0;c<n;c++)
if(binary_search(m-k[a]-k[b]-k[c]))
f=true;
}
}
if(f) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
int main()
{
while(cin>>n>>m)
{
for(int i=0;i<n;i++)
cin>>k[i];
solve();
}
return 0;
}
# endif
# if 0
/*
这是根据k1+k2+k3+k4=m进行的转换为k1+k2=m-k3-k4;然后在进行二分搜索进
行查找。
*/
# include <iostream>
# include <algorithm>
using namespace std;
# define MAX_N 1000
int n,m,k[MAX_N];
int kk[MAX_N*MAX_N];
bool binary_search(int x)
{
int l=0;
int r=n*n;
while(r-l>=1)
{
int i=(l+r)/2;
if(kk[i]==x) return true;
else if (kk[i]<x) l=i+1;
else r=i;
}
return false;
}
void solve ()
{
for(int c=0;c<n;c++)
{
for(int d=0;d<n;d++)
kk[c*n+d]=k[c]+k[d];
}
sort(kk,kk+n*n);
bool f=false;
for(int a=0;a<n;a++)
for(int b=0;b<n;b++)
if(binary_search(m-k[a]-k[b]))
f=true;
if(f) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
int main()
{
while(cin>>n>>m)
{
for(int i=0;i<n;i++)
cin>>k[i];
solve();
}
return 0;
}
# endif