unittest
{
//	assert( [ "2", "1 2" ].parse.expand.solve == "1 4\n5 4" );
//	assert( [ "3", "3 2 1" ].parse.expand.solve == "1 2 3\n5 3 1" );
//	assert( [ "3", "2 3 1" ].parse.expand.solve == "5 10 100\n100 10 1" );
}



import std.conv;
import std.format;
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 ) )
{
	input.popFront;
	auto ps = input.front.split.to!( long[] );
	return tuple( ps );
}

auto solve( long[] ps )
{
	auto as = new long[ ps.length ];
	auto bs = new long[ ps.length ];
	foreach( i, ref p; ps )
	{
		as[ p - 1 ] = i + 1;		// 順番を付ける
	}
	for( auto i = 1L; i < ps.length; i++ )
	{
		as[ i ] += as[ i - 1 ];		// as[ i - 1 ] < as[ i ] になるように累積和にする
	}
	bs[ 0 ] = as[ $ - 1 ];
	for( auto i = 1L; i < ps.length; i++ )
	{
		bs[ i ] = as[ $ - 1 ] - as[ i - 1 ];		// 累積和分を打ち消して順番だけ残るようにする
	}
	return format( "%s\n%s", as.to!( string[] ).join( " " ), bs.to!( string[] ).join( " " ) );
}
