/*
cf862a构造 异或
http://blog.csdn.net/lzc504603913/article/details/78041909
给你一个数k,让你用n个不同的非负整数异或出k。
首先要利用a^a=0,a^0=a这个性质
题目要求异或结果为x,由于x^0=x,我们只要用多个数凑出0即可
看了题解后,最开始想到的是1,2,3...n-2,(1<<17),(1<<17)^(1^2^...^(n-2))^x,
前面n-2个数直接写,后面尽量构造两个不重复的数,能够抵消掉前面数字的异或和,只留下x
这里用1<<17是因为它大于10^5且小于10^6,最高位有一个1,保证异或后的值一定不会小于自己,且一定比n大。
然而当(1^2^...^(n-2))与x相同时,
最后一个数(1<<17)^(1^2^...^(n-2))^x=(1<<17)^0=(1<<17),重复
所以再引入(1<<18),构造数列为1,2,3...n-3,(1<<17),(1<<18),(1<<17)^(1<<18)^(1^2^...^(n-3))^x
这样,即使(1^2^...^(n-3))^x==0,(1<<17)^(1<<18)也保证不与前面任何一个数重复
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <queue>
#include <cmath>
#include <algorithm>
#include <map>
#include <set>
#define ll long long
#define fr(i,a,b) for(int i=a;i<=b;i++)
#define frr(i,a,b) for(int i=a;i>=b;i--)
#define ms(a,b) memset(a,b,sizeof(a))
#define scfd(a) scanf("%d",a)
#define scflf(a) scanf("%lf",a)
#define scfs(a) scanf("%s",a)
#define ptfd(a) printf("%d\n",a)
#define ptfs(a) printf("%s\n",a)
#define showd(a,b) printf(a"=%d\n",b)
#define showlf(a,b) printf(a"=%lf\n",b)
#define shows(a,b) printf(a"=%s\n",b)
#define mmcp(a,b) memcpy(a,b,sizeof(b))
#define pb(a) push_back(a)
using namespace std;
int n,x;
int main(){
int t=1<<17;
int tt=1<<18;
cin>>n>>x;
if(n==2&&!x){
printf("NO\n");
exit(0);
}
if(n==1){
printf("YES\n%d\n",x);
exit(0);
}
if(n==2){
printf("YES\n%d %d\n",x,0);
exit(0);
}
puts("YES");
fr(i,1,n-3)
printf("%d ",i);
int f=0;
fr(i,1,n-3)
f^=i;
printf("%d %d %d\n",tt,t,t^tt^x^f);
return 0;
}