#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <bits/stdc++.h>
using namespace std;
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
template <class T>
using orderStaticTree =
tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
#define ll long long
#define saleh \
ios_base::sync_with_stdio(false); \
cin.tie(nullptr);
const int md = 1e9 + 7;
#define ll long long
const ll remo = -1e18;
struct Node
{
ll maxi, ind;
};
struct SegmentTree
{
ll n;
vector<Node> segData;
vector<ll> lazy;
SegmentTree(const vector<ll> &v)
{
n = v.size();
segData.resize(4 * n);
lazy.assign(4 * n, 0);
build(1, 0, n - 1, v);
}
void build(ll x, ll l, ll r, const vector<ll> &v)
{
if (l == r)
{
segData[x] = {v[l], l};
}
else
{
ll m = (l + r) / 2;
build(2 * x, l, m, v);
build(2 * x + 1, m + 1, r, v);
segData[x] = merge(segData[2 * x], segData[2 * x + 1]);
}
}
void push(ll x, ll l, ll r)
{
if (lazy[x] != 0)
{
segData[x].maxi += lazy[x];
if (l != r)
{
lazy[2 * x] += lazy[x];
lazy[2 * x + 1] += lazy[x];
}
lazy[x] = 0;
}
}
Node merge(Node a, Node b)
{
if (a.maxi > b.maxi)
return a;
if (b.maxi > a.maxi)
return b;
return (a.ind < b.ind ? b : a);
}
void addd(ll x, ll l, ll r, ll ql, ll qr, ll val)
{
push(x, l, r);
if (r < ql || l > qr)
return;
if (ql <= l && r <= qr)
{
lazy[x] += val;
push(x, l, r);
return;
}
ll m = (l + r) / 2;
addd(2 * x, l, m, ql, qr, val);
addd(2 * x + 1, m + 1, r, ql, qr, val);
segData[x] = merge(segData[2 * x], segData[2 * x + 1]);
}
Node maxx(ll x, ll l, ll r, ll ql, ll qr)
{
push(x, l, r);
if (r < ql || l > qr)
return {remo, -1};
if (ql <= l && r <= qr)
return segData[x];
ll m = (l + r) / 2;
Node left = maxx(2 * x, l, m, ql, qr);
Node right = maxx(2 * x + 1, m + 1, r, ql, qr);
return merge(left, right);
}
void remove(ll x, ll l, ll r, ll idx)
{
push(x, l, r);
if (l == r)
{
segData[x] = {remo, l};
return;
}
ll m = (l + r) / 2;
if (idx <= m)
remove(2 * x, l, m, idx);
else
remove(2 * x + 1, m + 1, r, idx);
segData[x] = merge(segData[2 * x], segData[2 * x + 1]);
}
Node get_max()
{
return maxx(1, 0, n - 1, 0, n - 1);
}
void update_suffix(ll from)
{
if (from < n - 1)
addd(1, 0, n - 1, from + 1, n - 1, -1);
}
void erase(ll idx)
{
remove(1, 0, n - 1, idx);
}
};
const int maxi = 2e5 + 5;
vector<int> tre[maxi];
vector<int> used;
int par[maxi];
ll a[maxi];
ll ansi[maxi];
void preCal(int node, int parnt)
{
par[node] = parnt;
for (int child : tre[node])
{
if (child != parnt)
{
preCal(child, node);
}
}
}
int main()
{
saleh;
int t;
scanf("%d", &t);
while (t--)
{
int n;
scanf("%d", &n);
for (int i = 1; i <= n; ++i)
scanf("%lld", &a[i]);
used.clear();
for (int i = 0; i < n - 1; ++i)
{
int u, v;
scanf("%d %d", &u, &v);
tre[u].push_back(v);
tre[v].push_back(u);
used.push_back(u);
used.push_back(v);
}
preCal(1, 0);
for (int i = 1; i <= n; ++i)
{
ll sum = 0;
ll maxi = a[i];
ll altr = 1;
int node = i;
sum = 0;
altr = 1;
while (node != 0)
{
sum += altr * a[node];
maxi = max(maxi, sum);
node = par[node];
altr *= -1;
}
ansi[i] = maxi;
}
for (int i = 1; i <= n; ++i)
printf("%lld ", ansi[i]);
printf("\n");
for (int i : used)
tre[i].clear();
}
return 0;
}
CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPHF1ZXVlPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8c2V0PgojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKI2luY2x1ZGUgPGV4dC9wYl9kcy9hc3NvY19jb250YWluZXIuaHBwPgp1c2luZyBuYW1lc3BhY2UgX19nbnVfcGJkczsKdGVtcGxhdGUgPGNsYXNzIFQ+CnVzaW5nIG9yZGVyU3RhdGljVHJlZSA9CiAgICB0cmVlPFQsIG51bGxfdHlwZSwgbGVzczxUPiwgcmJfdHJlZV90YWcsIHRyZWVfb3JkZXJfc3RhdGlzdGljc19ub2RlX3VwZGF0ZT47CgojZGVmaW5lIGxsIGxvbmcgbG9uZwoKI2RlZmluZSBzYWxlaCAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsgXAogICAgY2luLnRpZShudWxscHRyKTsKCmNvbnN0IGludCBtZCA9IDFlOSArIDc7CiNkZWZpbmUgbGwgbG9uZyBsb25nCgpjb25zdCBsbCByZW1vID0gLTFlMTg7CgpzdHJ1Y3QgTm9kZQp7CiAgICBsbCBtYXhpLCBpbmQ7Cn07CgpzdHJ1Y3QgU2VnbWVudFRyZWUKewogICAgbGwgbjsKICAgIHZlY3RvcjxOb2RlPiBzZWdEYXRhOwogICAgdmVjdG9yPGxsPiBsYXp5OwoKICAgIFNlZ21lbnRUcmVlKGNvbnN0IHZlY3RvcjxsbD4gJnYpCiAgICB7CiAgICAgICAgbiA9IHYuc2l6ZSgpOwogICAgICAgIHNlZ0RhdGEucmVzaXplKDQgKiBuKTsKICAgICAgICBsYXp5LmFzc2lnbig0ICogbiwgMCk7CiAgICAgICAgYnVpbGQoMSwgMCwgbiAtIDEsIHYpOwogICAgfQoKICAgIHZvaWQgYnVpbGQobGwgeCwgbGwgbCwgbGwgciwgY29uc3QgdmVjdG9yPGxsPiAmdikKICAgIHsKICAgICAgICBpZiAobCA9PSByKQogICAgICAgIHsKICAgICAgICAgICAgc2VnRGF0YVt4XSA9IHt2W2xdLCBsfTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgbGwgbSA9IChsICsgcikgLyAyOwogICAgICAgICAgICBidWlsZCgyICogeCwgbCwgbSwgdik7CiAgICAgICAgICAgIGJ1aWxkKDIgKiB4ICsgMSwgbSArIDEsIHIsIHYpOwogICAgICAgICAgICBzZWdEYXRhW3hdID0gbWVyZ2Uoc2VnRGF0YVsyICogeF0sIHNlZ0RhdGFbMiAqIHggKyAxXSk7CiAgICAgICAgfQogICAgfQoKICAgIHZvaWQgcHVzaChsbCB4LCBsbCBsLCBsbCByKQogICAgewogICAgICAgIGlmIChsYXp5W3hdICE9IDApCiAgICAgICAgewogICAgICAgICAgICBzZWdEYXRhW3hdLm1heGkgKz0gbGF6eVt4XTsKICAgICAgICAgICAgaWYgKGwgIT0gcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbGF6eVsyICogeF0gKz0gbGF6eVt4XTsKICAgICAgICAgICAgICAgIGxhenlbMiAqIHggKyAxXSArPSBsYXp5W3hdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxhenlbeF0gPSAwOwogICAgICAgIH0KICAgIH0KCiAgICBOb2RlIG1lcmdlKE5vZGUgYSwgTm9kZSBiKQogICAgewogICAgICAgIGlmIChhLm1heGkgPiBiLm1heGkpCiAgICAgICAgICAgIHJldHVybiBhOwogICAgICAgIGlmIChiLm1heGkgPiBhLm1heGkpCiAgICAgICAgICAgIHJldHVybiBiOwogICAgICAgIHJldHVybiAoYS5pbmQgPCBiLmluZCA/IGIgOiBhKTsKICAgIH0KCiAgICB2b2lkIGFkZGQobGwgeCwgbGwgbCwgbGwgciwgbGwgcWwsIGxsIHFyLCBsbCB2YWwpCiAgICB7CiAgICAgICAgcHVzaCh4LCBsLCByKTsKICAgICAgICBpZiAociA8IHFsIHx8IGwgPiBxcikKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIGlmIChxbCA8PSBsICYmIHIgPD0gcXIpCiAgICAgICAgewogICAgICAgICAgICBsYXp5W3hdICs9IHZhbDsKICAgICAgICAgICAgcHVzaCh4LCBsLCByKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBsbCBtID0gKGwgKyByKSAvIDI7CiAgICAgICAgYWRkZCgyICogeCwgbCwgbSwgcWwsIHFyLCB2YWwpOwogICAgICAgIGFkZGQoMiAqIHggKyAxLCBtICsgMSwgciwgcWwsIHFyLCB2YWwpOwogICAgICAgIHNlZ0RhdGFbeF0gPSBtZXJnZShzZWdEYXRhWzIgKiB4XSwgc2VnRGF0YVsyICogeCArIDFdKTsKICAgIH0KCiAgICBOb2RlIG1heHgobGwgeCwgbGwgbCwgbGwgciwgbGwgcWwsIGxsIHFyKQogICAgewogICAgICAgIHB1c2goeCwgbCwgcik7CiAgICAgICAgaWYgKHIgPCBxbCB8fCBsID4gcXIpCiAgICAgICAgICAgIHJldHVybiB7cmVtbywgLTF9OwogICAgICAgIGlmIChxbCA8PSBsICYmIHIgPD0gcXIpCiAgICAgICAgICAgIHJldHVybiBzZWdEYXRhW3hdOwogICAgICAgIGxsIG0gPSAobCArIHIpIC8gMjsKICAgICAgICBOb2RlIGxlZnQgPSBtYXh4KDIgKiB4LCBsLCBtLCBxbCwgcXIpOwogICAgICAgIE5vZGUgcmlnaHQgPSBtYXh4KDIgKiB4ICsgMSwgbSArIDEsIHIsIHFsLCBxcik7CiAgICAgICAgcmV0dXJuIG1lcmdlKGxlZnQsIHJpZ2h0KTsKICAgIH0KCiAgICB2b2lkIHJlbW92ZShsbCB4LCBsbCBsLCBsbCByLCBsbCBpZHgpCiAgICB7CiAgICAgICAgcHVzaCh4LCBsLCByKTsKICAgICAgICBpZiAobCA9PSByKQogICAgICAgIHsKICAgICAgICAgICAgc2VnRGF0YVt4XSA9IHtyZW1vLCBsfTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBsbCBtID0gKGwgKyByKSAvIDI7CiAgICAgICAgaWYgKGlkeCA8PSBtKQogICAgICAgICAgICByZW1vdmUoMiAqIHgsIGwsIG0sIGlkeCk7CiAgICAgICAgZWxzZQogICAgICAgICAgICByZW1vdmUoMiAqIHggKyAxLCBtICsgMSwgciwgaWR4KTsKICAgICAgICBzZWdEYXRhW3hdID0gbWVyZ2Uoc2VnRGF0YVsyICogeF0sIHNlZ0RhdGFbMiAqIHggKyAxXSk7CiAgICB9CgogICAgTm9kZSBnZXRfbWF4KCkKICAgIHsKICAgICAgICByZXR1cm4gbWF4eCgxLCAwLCBuIC0gMSwgMCwgbiAtIDEpOwogICAgfQoKICAgIHZvaWQgdXBkYXRlX3N1ZmZpeChsbCBmcm9tKQogICAgewogICAgICAgIGlmIChmcm9tIDwgbiAtIDEpCiAgICAgICAgICAgIGFkZGQoMSwgMCwgbiAtIDEsIGZyb20gKyAxLCBuIC0gMSwgLTEpOwogICAgfQoKICAgIHZvaWQgZXJhc2UobGwgaWR4KQogICAgewogICAgICAgIHJlbW92ZSgxLCAwLCBuIC0gMSwgaWR4KTsKICAgIH0KfTsKCmNvbnN0IGludCBtYXhpID0gMmU1ICsgNTsKdmVjdG9yPGludD4gdHJlW21heGldOwp2ZWN0b3I8aW50PiB1c2VkOwppbnQgcGFyW21heGldOwpsbCBhW21heGldOwpsbCBhbnNpW21heGldOwoKdm9pZCBwcmVDYWwoaW50IG5vZGUsIGludCBwYXJudCkKewogICAgcGFyW25vZGVdID0gcGFybnQ7CiAgICBmb3IgKGludCBjaGlsZCA6IHRyZVtub2RlXSkKICAgIHsKICAgICAgICBpZiAoY2hpbGQgIT0gcGFybnQpCiAgICAgICAgewogICAgICAgICAgICBwcmVDYWwoY2hpbGQsIG5vZGUpOwogICAgICAgIH0KICAgIH0KfQoKaW50IG1haW4oKQp7CiAgICBzYWxlaDsKICAgIGludCB0OwogICAgc2NhbmYoIiVkIiwgJnQpOwogICAgd2hpbGUgKHQtLSkKICAgIHsKICAgICAgICBpbnQgbjsKICAgICAgICBzY2FuZigiJWQiLCAmbik7CgogICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47ICsraSkKICAgICAgICAgICAgc2NhbmYoIiVsbGQiLCAmYVtpXSk7CgogICAgICAgIHVzZWQuY2xlYXIoKTsKCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuIC0gMTsgKytpKQogICAgICAgIHsKICAgICAgICAgICAgaW50IHUsIHY7CiAgICAgICAgICAgIHNjYW5mKCIlZCAlZCIsICZ1LCAmdik7CiAgICAgICAgICAgIHRyZVt1XS5wdXNoX2JhY2sodik7CiAgICAgICAgICAgIHRyZVt2XS5wdXNoX2JhY2sodSk7CiAgICAgICAgICAgIHVzZWQucHVzaF9iYWNrKHUpOwogICAgICAgICAgICB1c2VkLnB1c2hfYmFjayh2KTsKICAgICAgICB9CgogICAgICAgIHByZUNhbCgxLCAwKTsKCiAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgKytpKQogICAgICAgIHsKICAgICAgICAgICAgbGwgc3VtID0gMDsKICAgICAgICAgICAgbGwgbWF4aSA9IGFbaV07CiAgICAgICAgICAgIGxsIGFsdHIgPSAxOwogICAgICAgICAgICBpbnQgbm9kZSA9IGk7CgogICAgICAgICAgICBzdW0gPSAwOwogICAgICAgICAgICBhbHRyID0gMTsKICAgICAgICAgICAgd2hpbGUgKG5vZGUgIT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3VtICs9IGFsdHIgKiBhW25vZGVdOwogICAgICAgICAgICAgICAgbWF4aSA9IG1heChtYXhpLCBzdW0pOwogICAgICAgICAgICAgICAgbm9kZSA9IHBhcltub2RlXTsKICAgICAgICAgICAgICAgIGFsdHIgKj0gLTE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGFuc2lbaV0gPSBtYXhpOwogICAgICAgIH0KCiAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgKytpKQogICAgICAgICAgICBwcmludGYoIiVsbGQgIiwgYW5zaVtpXSk7CiAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIGZvciAoaW50IGkgOiB1c2VkKQogICAgICAgICAgICB0cmVbaV0uY2xlYXIoKTsKICAgIH0KCiAgICByZXR1cm4gMDsKfQ==