unittest
{
	assert( [ "5 2 4" ].parse.expand.solve == "5\n4\n1\n0" );
	assert( [ "3 1 3" ].parse.expand.solve == "3\n0" );
	assert( [ "7 3 7" ].parse.expand.solve == "7\n8\n4\n2\n0\n0" );
	assert( [ "10 4 8" ].parse.expand.solve == "10\n12\n10\n8\n4\n1\n0\n0\n0" );
}



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 nxy = input.front.split.to!( long[] );
	nxy[ 1 .. $ ] -= 1;
	return tuple( nxy[ 0 ], nxy[ 1 ], nxy[ 2 ] );
}

auto solve( long n, long x, long y )
{
	auto nss = new long[][ n ];
	foreach( i; 1L .. nss.length.signed )
	{
		nss[ i - 1 ] ~= i;
		nss[ i ] ~= i - 1;
	}
	nss[ x ] ~= y;
	nss[ y ] ~= x;
	
	auto anss = new long[ n - 1 ];
	foreach( i; 0L .. n )
	{
		auto ds = bfs( nss, i );
		foreach( d; ds[ i + 1 .. $ ] )
		{
			anss[ d - 1 ]++;
		}
	}
	return anss.to!( string[] ).join( "\n" );
}

// グラフの始点指定最短経路探索（幅優先探索）
auto bfs( long[][] nss, long s )
{
	import std.container.dlist;
	
	auto ds = new long[ nss.length ];
	ds[] = long.max;
	ds[ s ] = 0;
	
	auto queue = make!DList( s );
	while( !queue.empty )
	{
		auto f = queue.front;
		queue.removeFront();
		
		foreach( t; nss[ f ] )
		{
			if( ds[ t ] < long.max ) continue;
			
			ds[ t ] = ds[ f ] + 1;
			queue.insertBack( t );
		}
	}
	return ds;
}
