1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
//Franciszek Witt
#include<bits/stdc++.h>
using namespace std;
#define FOR(i,l,r) for(int i=(l);i<=(r);++i)
#define REP(i,n) FOR(i,0,(n)-1)
#define ssize(x) int(x.size())
template<class A,class B>auto&operator<<(ostream&o,pair<A,B>p){return o<<'('<<p.first<<", "<<p.second<<')';}
template<class T>auto operator<<(ostream&o,T x)->decltype(x.end(),o){o<<'{';int i=0;for(auto e:x)o<<(", ")+2*!i++<<e;return o<<'}';}
#ifdef DEBUG
#define debug(x...) cerr<<"["#x"]: ",[](auto...$){((cerr<<$<<"; "),...);}(x),cerr<<'\n'
#else
#define debug(...) {}
#endif
typedef long long ll;
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n;
    cin >> n;
    vector zas(n + 1, 0LL);
    vector tree(n + 1, vector<pair<int, ll>>());

    FOR(i, 1, n)
        cin >> zas[i];

    REP(i, n - 1) {
        int a, b;
        ll c;
        cin >> a >> b >> c;
        tree[a].emplace_back(b, c);
        tree[b].emplace_back(a, c);
    }

    vector<int> wyn(n + 1);
    vector<int> bn(n + 1);
    queue<int> qq;
    int ti = 0;
    int li = 0;
    FOR(w, 1, n) {
        ++ti;
        function<void(int, int, ll)> dfs = [&] (int x, int par, ll dist) {
            if(dist < 0LL)
                return;
            if(bn[x] < ti) {
                bn[x] = ti;
                qq.push(x);
            }
            if(zas[x] >= dist && par != -1)
                return;
            for(auto [i, j] : tree[x])
                if(i != par)
                    dfs(i, x, dist - j);
        };
        debug(w);
        qq.push(w);
        bn[w] = ti;
        while(!qq.empty()) {
            ++wyn[w];
            debug(qq.front());
            dfs(qq.front(), -1, zas[qq.front()]);
            qq.pop();
        }
//        cout << li << endl;
    }
    FOR(i, 1, n)
        cout << wyn[i] << " ";
    cout << endl;
}