unittest
{
//	assert( [ "4 4" ].parse.expand.solve == "Yes\n1\n6\n3\n7\n4\n5\n2" );
	assert( [ "2 1" ].parse.expand.solve == "No" );
}



import std.conv;
import std.range;
import std.stdio;
import std.typecons;

void main()
{
	stdin.byLineCopy.parse.expand.solve.writeln;
}

auto parse( Range )( Range input )
if( isInputRange!Range && is( ElementType!Range == string ) )
{
	auto nx = input.front.split.to!( long[] );
	return tuple( nx[ 0 ], nx[ 1 ] );
}

auto solve( long n, long x )
{
	auto m = n * 2 - 1;
	
	// 端の値は中央値になれないのでダメ
	if( x <= 1 || m <= x ) return "No";
	
	// 真ん中は最上段の値と同じにする
	auto anss = new long[ m ];
	anss[ n - 1 ] = x;
	
	// 右は内側から大きい値で埋める
	foreach( ref ans; anss[ n .. $ ] )
	{
		ans = m;
		m--;
		if( m == x ) m--;
	}
	
	// 右は外側から大きい値で埋める
	foreach( ref ans; anss[ 0 .. n - 1 ] )
	{
		ans = m;
		m--;
		if( m == x ) m--;
	}
	
	return "Yes\n" ~ anss.to!( string[] ).join( "\n" );
}
