unittest
{
	assert( [ "10", "1 2 5 3 4 6 7 3 2 4", "1 2", "2 3", "3 4", "4 5", "3 6", "6 7", "1 8", "8 9", "9 10" ].parse.expand.solve == "1\n2\n3\n3\n4\n4\n5\n2\n2\n3" );
	
	assert( [ "9", "1 2 3 1 2 3 1 2 3", "1 2", "2 3", "3 4", "4 5", "5 6", "6 7", "7 8", "8 9" ].parse.expand.solve == "1\n2\n3\n3\n3\n3\n3\n3\n3" );		// 追加ケース
	assert( [ "9", "10 20 30 40 50 1 2 3 4", "1 2", "2 3", "3 4", "4 5", "6 2", "6 7", "7 8", "8 9" ].parse.expand.solve == "1\n2\n3\n4\n5\n2\n2\n3\n4" );		// 追加ケース
}



import std.container;
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 );
	input.popFront;
	auto as = input.front.split.to!( long[] );
	auto uvs = new long[ 2 ][ n - 1 ];
	foreach( ref uv; uvs )
	{
		input.popFront;
		uv = input.front.split.to!( long[] );
		uv[] -= 1;
	}
	return tuple( as, uvs );
}

auto solve( long[] as, long[ 2 ][] uvs )
{
	// dfs + lis する
	auto anss = new long[ as.length ];
	
	auto l = 0L;
	auto dp = new long[ as.length ];
	dp[] = long.max;
	auto dp_s = dp.assumeSorted;
	
	auto nss = toAdjacencyList!true( as.length, uvs );
	auto stack_f = SList!( long )( 0L );					// 進む用スタック
	auto stack_b = SList!( Tuple!( long, long ) )();		// 戻る用スタック
	while( !stack_f.empty )
	{
		auto f = stack_f.front;
		stack_f.removeFront;
		
		if( 0 <= f )
		{
			// 葉に向かって進む
			auto i = dp_s.lowerBound( as[ f ] ).length.signed;
			stack_b.insertFront( tuple( i, dp_s[ i ] ) );
			dp_s[ i ] = as[ f ];
			if( l <= i ) l = i + 1;
			anss[ f ] = l;
			
			stack_f.insertFront( -1L );		// 戻るタイミングを入れておく
			foreach( t; nss[ f ] )
			{
				if( anss[ t ] == 0 ) stack_f.insertFront( t );
			}
		}
		else
		{
			// 根に向かって戻る
			auto i = stack_b.front[ 0 ];
			auto a = stack_b.front[ 1 ];
			stack_b.removeFront;
			
			dp[ i ] = a;
			if( a == long.max ) l = i;
		}
	}
	return anss.to!( string[] ).join( "\n" );
}

// 辺配列から隣接リストを作成
auto toAdjacencyList( bool undirected = false )( long n, long[ 2 ][] es )
{
	auto nss = new long[][ n ];
	foreach( e; es )
	{
		nss[ e[ 0 ] ] ~= e[ 1 ];
		static if( undirected ) nss[ e[ 1 ] ] ~= e[ 0 ];
	}
	return nss;
}
