推棋子
题号:NC221663
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

牛牛和牛妹又在玩一个游戏。
牛妹和牛牛打赌,如果牛牛输了,今晚牛牛就女装;如果牛妹输了,牛妹今晚就不看牛牛女装。(牛牛:???)

游戏有一张地图,是一棵有n个结点的树。每个结点都有一个分数,编号为i的结点的分数为a_i

在某个结点上面有一颗棋子,牛牛和牛妹沿着边轮流移动棋子,牛牛先,牛妹后。当移动到编号为i的根节点后,移动棋子的那个人的分数就会加上那个结点的分数a_i。棋子不能移动到之前移动过的地方。当棋子无法再移动时则游戏结束。

牛牛想知道当棋子初始位置在哪个结点,(牛牛的分数-牛妹的分数)最大,最大为多少?

输入描述:

一共n+1行。
第一行输入一个数n,表示结点个数。
第二行输入n个数a_1,a_2,a_3...a_n表示编号为i的结点上的分数为a_i
第三行到第n+1行每行输入两个数u_iv_i,表示第u_i号结点和第v_i号结点有一条边。

输出描述:

共一行,两个数p,q,表示棋子初始位置在p号结点时,(牛牛的分数-牛妹的分数)最大,最大为q,q可能为负数。
如果符合条件的p有多个,则输出编号最小的那个点。
示例1

输入

复制
5
5 7 2 3 4
1 2
2 3
1 4
1 5

输出

复制
3 6

备注: