Problem:
Score : 600 points

Problem Statement

We have a tree with N vertices, whose i-th edge connects Vertex u_i and Vertex v_i.
Vertex i has an integer a_i written on it.
For every integer k from 1 through N, solve the following problem:

We will make a sequence by lining up the integers written on the vertices along the shortest path from Vertex 1 to Vertex k, in the order they appear. Find the length of the longest increasing subsequence of this sequence.

Here, the longest increasing subsequence of a sequence A of length L is the subsequence A_{i_1} , A_{i_2} , ... , A_{i_M} with the greatest possible value of M such that 1 \leq i_1 < i_2 < ... < i_M \leq L and A_{i_1} < A_{i_2} < ... < A_{i_M}.

Constraints

2 \leq N \leq 2 \times 10^5

1 \leq a_i \leq 10^9

1 \leq u_i , v_i \leq N

u_i \neq v_i

The given graph is a tree.

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N
a_1 a_2 ... a_N
u_1 v_1
u_2 v_2
:
u_{N-1} v_{N-1}

Output

Print N lines. The k-th line, print the length of the longest increasing subsequence of the sequence obtained from the shortest path from Vertex 1 to Vertex k.

Sample Input 1

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

Sample Output 1

1
2
3
3
4
4
5
2
2
3

For example, the sequence A obtained from the shortest path from Vertex 1 to Vertex 5 is 1,2,5,3,4. Its longest increasing subsequence is A_1, A_2, A_4, A_5, with the length of 4.

Solution in C++ (GCC 9.2.1) (judge verdict: Wrong Answer)

#include <bits/stdc++.h>
#define max(x, y) ((x) > (y) ? (x) : (y))
#define min(x, y) ((x) < (y) ? (x) : (y))
#define abs(x) ((x) < 0 ? (-(x)) : (x))
#define rep(i,a,m) for((i) = (a) ; (i) < (m) ; ++(i))
#define REP(i,n) for((i)=0;(i)<(int)(n);(i)++)
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) x.begin(),x.end()
#define rall(x) x.end(),x.begin()
#define sz(x) ((int)x.size())
#define PI 3.14159265

using namespace std;
typedef unsigned long long ull;
typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<vi> vvi;
typedef vector<vl> vvl;
typedef pair<int,int> pi;
int a, b, c, i, j, k;
long long ans = 0LL;
long double eps = 1.0E-14;
long long MOD = 1000000007;
vector<bool> visited;
vector<int> vec;
vector<int> answers;
int LIS(vector<int> &pec, vector<int> &marker) {
    int l = pec.size();
    if (l == 0) return 0;
    marker[0] = 1;
    if (l < 2) return l;
    vector<int> lis(pec.size(), 0);
    lis[0] = 1;
    int tmp = 1;
    for(int i = 1; i < l; ++ i) {
        lis[i] = 1;
        tmp = 1;
        for(int j = 0; j < i; ++ j) {
            if (pec[i] > pec[j] && lis[j] + 1 > lis[i]) {
                lis[i] = lis[j] + 1;
                tmp = max(tmp, lis[i]);
            }
        }
        marker[i] = tmp;
    }
    return *max_element(lis.begin(), lis.end());
}

void dfs(vector<vector<int>> &G,int v, vector<int> &rec, vector<int> &ptrs){
    if (visited[v]) {
        /*
        for(auto aa : rec) {
            cout << aa << " ";
        }
        cout << endl;
        */
        vector<int> markers(ptrs.size(), 0);
        ans = max(ans, LIS(rec, markers));
        for(int i = 0; i < ptrs.size(); ++ i) {
            answers[ptrs[i]] = max(answers[ptrs[i]], markers[i]);
        }
        return ;
    }
    rec.pb(vec[v]);
    ptrs.pb(v);
    visited[v] = true;
   // int aw = LIS(rec);
    //answers[v] = max(answers[v], aw);
    for(auto a : G[v]) {
        dfs(G,a,rec,ptrs);
    }
    visited[v] = false;
    rec.pop_back();
    ptrs.pop_back();
}

int main ()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	int t,T;
	cin >> T;
    int c,d;
    vec = vector<int>(T,0);
    vector<vector<int>> G(T, vector<int>());
    visited = vector<bool>(T,false);
    answers = vector<int>(T,0);
	for(t = 1; t <= T; ++ t){
        cin >> a;
        vec[t-1] = a;
	}
    vector<int> ptrs;
    for(b = 1; b < T; ++ b) {
        cin >> c >> d;
        --c;
        --d;
        G[c].pb(d);
        G[d].pb(c);
    }
    vector<int> lis;
    dfs(G, 0, lis,ptrs);
   // cout << ans << endl;
    for(auto a : answers) {
        cout << a << endl;
    }
	return 0;
}