import java.util.*;
class Pair<A, B> {
public A first;
public B second;
public Pair(A first, B second) {
this.first = first;
this.second = second;
}
}
class Solution {
public void DFS(int node, ArrayList<Integer>[] G, int[] used, int[] parent, int[] val, int[] lvl, ArrayList<Integer> leafNodes, long[] weightedSubtreeSum) {
used[node] = 1;
int size = G[node].size();
if(node != 1 && size == 1) {
leafNodes.add(node);
}
for(int child : G[node]) { // Here child can be parent also as this is bidirectional
if(used[child] == 0) { // if we have 1 - 2 - 3 then child in G[node] will be 1 and 3 but 1 is parent
parent[child] = node; // This is defined by this array
lvl[child] = lvl[node] + 1;
DFS(child, G, used, parent, val, lvl, leafNodes, weightedSubtreeSum);
}
}
// Bottom up
// as we have passed the DFS Call above so this is now bottom up
for(int child : G[node]) {
if(child != parent[node]) {
weightedSubtreeSum[node] += weightedSubtreeSum[child];
}
}
weightedSubtreeSum[node] += val[node] * lvl[node];
}
public void DFSForSubtreeLeafRange
(int node, ArrayList
<Integer
>[] G,
int[] parent,
int[] subtreeLeafIndices, Pair
<Integer, Integer
>[] subtreeLeafRange
) {
for(int child : G[node]){
// if node is the parent of child then only do the following
// to make sure that we don't keep running dfs on our parent
if(node == parent[child]) {
DFSForSubtreeLeafRange(child, G, parent, subtreeLeafIndices, subtreeLeafRange);
}
}
// Bottom Up
for(int child : G[node]) { // As child can be parents also due to definiton of G
if(child != parent[node]) {
subtreeLeafRange
[node
].
first = Math.
min(subtreeLeafRange
[node
].
first, subtreeLeafRange
[child
].
first); subtreeLeafRange
[node
].
second = Math.
max(subtreeLeafRange
[node
].
second, subtreeLeafRange
[child
].
second); }
}
if(G[node].size() == 1 && node != 1) {
subtreeLeafRange[node].first = subtreeLeafIndices[node];
subtreeLeafRange[node].second = subtreeLeafIndices[node];
}
System.
out.
println(node
+ " " + subtreeLeafRange
[node
].
first + " " + subtreeLeafRange
[node
].
second); }
}
public class Main {
public static void main
(String[] args
) {
Solution s = new Solution();
Scanner scanner
= new Scanner
(System.
in); int n = scanner.nextInt();
int[] val = new int[n + 1];
for (int i = 1; i <= n; i++) {
val[i] = scanner.nextInt();
}
ArrayList
<Integer
>[] G
= new ArrayList[n
+ 1];
for (int i = 0; i <= n; i++) {
G[i] = new ArrayList<>();
}
for (int i = 1; i <= n - 1; i++) {
int u = scanner.nextInt();
int v = scanner.nextInt();
G[u].add(v);
G[v].add(u);
}
int[] used = new int[n + 1];
int[] parent = new int[n + 1];
int[] lvl = new int[n + 1];
ArrayList<Integer> leafNodes = new ArrayList<>();
long[] weightedSubtreeSum = new long[n+1];
s.DFS(1, G, used, parent, val, lvl, leafNodes, weightedSubtreeSum);
Pair
<Integer, Integer
>[] subtreeLeafRange
= new Pair
[n
+ 1]; int[] subtreeLeafIndices = new int[n + 1];
for(int i = 0; i < leafNodes.size(); i++) {
subtreeLeafIndices[leafNodes.get(i)] = i;
}
s.DFSForSubtreeLeafRange(1, G, parent, subtreeLeafIndices, subtreeLeafRange);
}
}
aW1wb3J0IGphdmEudXRpbC4qOwoKY2xhc3MgUGFpcjxBLCBCPiB7CgogICAgcHVibGljIEEgZmlyc3Q7CiAgICBwdWJsaWMgQiBzZWNvbmQ7CgogICAgcHVibGljIFBhaXIoQSBmaXJzdCwgQiBzZWNvbmQpIHsKICAgICAgICB0aGlzLmZpcnN0ID0gZmlyc3Q7CiAgICAgICAgdGhpcy5zZWNvbmQgPSBzZWNvbmQ7CiAgICB9Cgp9CgpjbGFzcyBTb2x1dGlvbiB7CgogICAgcHVibGljIHZvaWQgREZTKGludCBub2RlLCBBcnJheUxpc3Q8SW50ZWdlcj5bXSBHLCBpbnRbXSB1c2VkLCBpbnRbXSBwYXJlbnQsIGludFtdIHZhbCwgaW50W10gbHZsLCBBcnJheUxpc3Q8SW50ZWdlcj4gbGVhZk5vZGVzLCBsb25nW10gd2VpZ2h0ZWRTdWJ0cmVlU3VtKSB7CgogICAgICAgIHVzZWRbbm9kZV0gPSAxOwoKICAgICAgICBpbnQgc2l6ZSA9IEdbbm9kZV0uc2l6ZSgpOwoKICAgICAgICBpZihub2RlICE9IDEgJiYgc2l6ZSA9PSAxKSB7CiAgICAgICAgICAgIGxlYWZOb2Rlcy5hZGQobm9kZSk7CiAgICAgICAgfQoKCiAgICAgICAgZm9yKGludCBjaGlsZCA6IEdbbm9kZV0pIHsgICAgLy8gSGVyZSBjaGlsZCBjYW4gYmUgcGFyZW50IGFsc28gYXMgdGhpcyBpcyBiaWRpcmVjdGlvbmFsCiAgICAgICAgICAgIGlmKHVzZWRbY2hpbGRdID09IDApIHsgICAgICAvLyBpZiB3ZSBoYXZlIDEgLSAyIC0gMyB0aGVuIGNoaWxkIGluIEdbbm9kZV0gd2lsbCBiZSAxIGFuZCAzIGJ1dCAxIGlzIHBhcmVudCAKICAgICAgICAgICAgICAgIHBhcmVudFtjaGlsZF0gPSBub2RlOyAgIC8vIFRoaXMgaXMgZGVmaW5lZCBieSB0aGlzIGFycmF5CiAgICAgICAgICAgICAgICBsdmxbY2hpbGRdID0gbHZsW25vZGVdICsgMTsKICAgICAgICAgICAgICAgIERGUyhjaGlsZCwgRywgdXNlZCwgcGFyZW50LCB2YWwsIGx2bCwgbGVhZk5vZGVzLCB3ZWlnaHRlZFN1YnRyZWVTdW0pOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBCb3R0b20gdXAKICAgICAgICAvLyBhcyB3ZSBoYXZlIHBhc3NlZCB0aGUgREZTIENhbGwgYWJvdmUgc28gdGhpcyBpcyBub3cgYm90dG9tIHVwCgogICAgICAgIGZvcihpbnQgY2hpbGQgOiBHW25vZGVdKSB7CiAgICAgICAgICAgIGlmKGNoaWxkICE9IHBhcmVudFtub2RlXSkgewogICAgICAgICAgICAgICAgd2VpZ2h0ZWRTdWJ0cmVlU3VtW25vZGVdICs9IHdlaWdodGVkU3VidHJlZVN1bVtjaGlsZF07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHdlaWdodGVkU3VidHJlZVN1bVtub2RlXSArPSB2YWxbbm9kZV0gKiBsdmxbbm9kZV07CiAgICB9CgogICAgcHVibGljIHZvaWQgREZTRm9yU3VidHJlZUxlYWZSYW5nZShpbnQgbm9kZSwgQXJyYXlMaXN0PEludGVnZXI+W10gRywgaW50W10gcGFyZW50LCBpbnRbXSBzdWJ0cmVlTGVhZkluZGljZXMsIFBhaXI8SW50ZWdlciwgSW50ZWdlcj5bXSBzdWJ0cmVlTGVhZlJhbmdlKSB7CgogICAgICAgIGZvcihpbnQgY2hpbGQgOiBHW25vZGVdKXsKCiAgICAgICAgICAgIC8vIGlmIG5vZGUgaXMgdGhlIHBhcmVudCBvZiBjaGlsZCB0aGVuIG9ubHkgZG8gdGhlIGZvbGxvd2luZwogICAgICAgICAgICAvLyB0byBtYWtlIHN1cmUgdGhhdCB3ZSBkb24ndCBrZWVwIHJ1bm5pbmcgZGZzIG9uIG91ciBwYXJlbnQKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmKG5vZGUgPT0gcGFyZW50W2NoaWxkXSkgewogICAgICAgICAgICAgICAgREZTRm9yU3VidHJlZUxlYWZSYW5nZShjaGlsZCwgRywgcGFyZW50LCBzdWJ0cmVlTGVhZkluZGljZXMsIHN1YnRyZWVMZWFmUmFuZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBCb3R0b20gVXAKCiAgICAgICAgc3VidHJlZUxlYWZSYW5nZVtub2RlXSA9IG5ldyBQYWlyPEludGVnZXIsIEludGVnZXI+KEludGVnZXIuTUFYX1ZBTFVFLCBJbnRlZ2VyLk1JTl9WQUxVRSk7CgogICAgICAgIGZvcihpbnQgY2hpbGQgOiBHW25vZGVdKSB7IC8vIEFzIGNoaWxkIGNhbiBiZSBwYXJlbnRzIGFsc28gZHVlIHRvIGRlZmluaXRvbiBvZiBHCiAgICAgICAgICAgIGlmKGNoaWxkICE9IHBhcmVudFtub2RlXSkgewogICAgICAgICAgICAgICAgc3VidHJlZUxlYWZSYW5nZVtub2RlXS5maXJzdCA9IE1hdGgubWluKHN1YnRyZWVMZWFmUmFuZ2Vbbm9kZV0uZmlyc3QsIHN1YnRyZWVMZWFmUmFuZ2VbY2hpbGRdLmZpcnN0KTsKICAgICAgICAgICAgICAgIHN1YnRyZWVMZWFmUmFuZ2Vbbm9kZV0uc2Vjb25kID0gTWF0aC5tYXgoc3VidHJlZUxlYWZSYW5nZVtub2RlXS5zZWNvbmQsIHN1YnRyZWVMZWFmUmFuZ2VbY2hpbGRdLnNlY29uZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmKEdbbm9kZV0uc2l6ZSgpID09IDEgJiYgbm9kZSAhPSAxKSB7CiAgICAgICAgICAgIHN1YnRyZWVMZWFmUmFuZ2Vbbm9kZV0uZmlyc3QgPSBzdWJ0cmVlTGVhZkluZGljZXNbbm9kZV07CiAgICAgICAgICAgIHN1YnRyZWVMZWFmUmFuZ2Vbbm9kZV0uc2Vjb25kID0gc3VidHJlZUxlYWZJbmRpY2VzW25vZGVdOwogICAgICAgIH0KCiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG5vZGUgKyAiICIgKyBzdWJ0cmVlTGVhZlJhbmdlW25vZGVdLmZpcnN0ICsgIiAiICsgc3VidHJlZUxlYWZSYW5nZVtub2RlXS5zZWNvbmQpOwogICAgfQp9CgpwdWJsaWMgY2xhc3MgTWFpbiB7CgogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewoKICAgICAgICBTb2x1dGlvbiBzID0gbmV3IFNvbHV0aW9uKCk7CgogICAgICAgIFNjYW5uZXIgc2Nhbm5lciA9IG5ldyBTY2FubmVyKFN5c3RlbS5pbik7CiAgICAgICAgaW50IG4gPSBzY2FubmVyLm5leHRJbnQoKTsKCiAgICAgICAgaW50W10gdmFsID0gbmV3IGludFtuICsgMV07CgogICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgewogICAgICAgICAgICB2YWxbaV0gPSBzY2FubmVyLm5leHRJbnQoKTsKICAgICAgICB9CgogICAgICAgIEFycmF5TGlzdDxJbnRlZ2VyPltdIEcgPSBuZXcgQXJyYXlMaXN0W24gKyAxXTsKCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gbjsgaSsrKSB7CiAgICAgICAgICAgIEdbaV0gPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICB9CgogICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG4gLSAxOyBpKyspIHsKICAgICAgICAgICAgaW50IHUgPSBzY2FubmVyLm5leHRJbnQoKTsKICAgICAgICAgICAgaW50IHYgPSBzY2FubmVyLm5leHRJbnQoKTsKICAgICAgICAgICAgR1t1XS5hZGQodik7CiAgICAgICAgICAgIEdbdl0uYWRkKHUpOwogICAgICAgIH0KCiAgICAgICAgaW50W10gdXNlZCA9IG5ldyBpbnRbbiArIDFdOwogICAgICAgIGludFtdIHBhcmVudCA9IG5ldyBpbnRbbiArIDFdOwogICAgICAgIGludFtdIGx2bCA9IG5ldyBpbnRbbiArIDFdOwogICAgICAgIEFycmF5TGlzdDxJbnRlZ2VyPiBsZWFmTm9kZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICBsb25nW10gd2VpZ2h0ZWRTdWJ0cmVlU3VtID0gbmV3IGxvbmdbbisxXTsKCiAgICAgICAgcy5ERlMoMSwgRywgdXNlZCwgcGFyZW50LCB2YWwsIGx2bCwgbGVhZk5vZGVzLCB3ZWlnaHRlZFN1YnRyZWVTdW0pOwoKICAgICAgICBQYWlyPEludGVnZXIsIEludGVnZXI+W10gc3VidHJlZUxlYWZSYW5nZSA9IG5ldyBQYWlyW24gKyAxXTsKICAgICAgICBpbnRbXSAgc3VidHJlZUxlYWZJbmRpY2VzID0gbmV3IGludFtuICsgMV07CgogICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBsZWFmTm9kZXMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgc3VidHJlZUxlYWZJbmRpY2VzW2xlYWZOb2Rlcy5nZXQoaSldID0gaTsKICAgICAgICB9CgogICAgICAgIHMuREZTRm9yU3VidHJlZUxlYWZSYW5nZSgxLCBHLCBwYXJlbnQsIHN1YnRyZWVMZWFmSW5kaWNlcywgc3VidHJlZUxlYWZSYW5nZSk7CiAgICB9Cn0K