#P9830. Simple Tree Problem

Simple Tree Problem

Simple Tree Problem

Problem Description

There is an undirected tree with nn vertices and n1n-1 edges. The ii-th vertex has a positive integer value of aia_i(i=1,2,,ni=1,2,\dots,n). The ii-th edge has a positive integer value of kik_i(i=1,2,,n1i=1,2,\dots,n-1). We define f(x,T)f(x, T) as the total number of vertices in tree TT with value equal to xx. We define g(y,T)g(y, T) as the maximum xx that satisfies f(x,T)f(x, T) is not less than yy, if there is no xx that satisfies the condition, then g(y,T)g(y, T) is equal to 00. For the ii-th edge, if\textbf{if} we remove it, the original tree will be divided into two new trees, denoted as Ti1T_{i_1} and Ti2T_{i_2}, respectively. For the ii-th edge, you need to calculate max(g(ki,Ti1),g(ki,Ti2))\max(g(k_i, T_{i_1}),g(k_i, T_{i_2}))(i=1,2,,n1i=1,2,\dots,n-1). $\textbf{Please note that for each edge, we will not really remove it.}$ $\textbf{Please pay attention to the time complexity of your program.}$

Input

Each test contains multiple test cases. The first line of input contains a single integer t(1t106)t (1 \leq t \leq 10^{6})——the number of test cases. The description of test cases follows. The first line of each test case contains a single integer n(1n106)n(1 \leq n \leq 10^{6}) —— the number of vertices. The second line of each test case contains nn integers ai(1ai109)a_i(1 \leq a_i \leq 10^{9}) —— indicating the value of each vertex. The following n1n-1 lines of each test case contains three integers uiu_i,viv_i and kik_i (1ui,vi,kin,uivi)(1 \leq u_i,v_i,k_i \leq n,u_i \neq v_i) —— indicating an edge with value kik_i between vertices uiu_i and viv_i. It is guaranteed that the given edges form a tree. It is guaranteed that the sum of nn does not exceed 3×1063\times 10^{6}.

Output

For each testcase, output n1n-1 lines, where the ii-th line contains an integer representing the answer to the ii-th edge. Notes: In this problem, you may need more stack space to pass this problem. We suggest you to add the following code into your main function if you use C++.

int main() {
int size(512<<20); // 512M
__asm__ ( "movq %0, %%rsp\n"::"r"((char*)malloc(size)+size));
// YOUR CODE
...
exit(0);
}

And if you use the code above please DON’T forget to add exit(0)\textbf{DON'T forget to add exit(0)}; in the end of your main function, otherwise your code may get RE.

Sample Input

3
5
5 2 1 2 2
3 4 2
3 2 1
2 1 1
2 5 1
5
2 1 3 1 5
2 4 1
2 1 2
1 3 2
1 5 3
1
3

Sample Output

2
5
5
5
5
1
1
0

Source

2023“钉耙编程”中国大学生算法设计超级联赛(4)