unittest
{
	assert( [ "4" ].parse.expand.solve == "3\n1" );
	assert( [ "7" ].parse.expand.solve == "4\n3" );
	assert( [ "1" ].parse.expand.solve == "1" );
}



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 n = input.front.to!( long );
	return tuple( n );
}

auto solve( long n )
{
	// 解く必要がある問題の最大値を計算
	auto i = 1L;
	for( ; i <= n + 1; i++ )
	{
		auto t = ( i * ( i + 1 ) ) / 2;
		if( n <= t ) break;
	}
	
	// 解く必要がある問題を列挙
	auto anss = new long[ n ];
	auto ansi = 0L;
	auto t = 0L;
	for( ; 0 < i && t != n; i-- )
	{
		if( n < t + i ) continue;
		t += i;
		anss[ ansi ] = i;
		ansi++;
	}
	return anss[ 0 .. ansi ].to!( string[] ).join( "\n" );
}
