#include <bits/stdc++.h>
using namespace std;
template<typename T>
struct Fenwick {
    int n, m = 1;
    vector<T> bit;
    Fenwick(int n): n(n), bit(n + 1){
        while(2 * m <= n) m *= 2;
    }
    void update(int i, T x){
        for (; i <= n; i += i & -i)
            bit[i] += x;
    }
    T get(int i){
        T res = 0;
        for (; i; i -= i & -i)
            res += bit[i];
        return res;
    }
    T get(int l, int r){
        return get(r) - get(l - 1);
    }
    int order(T k){
        T s = 0;
        int pos = 0;
        for (int i = m; i; i >>= 1){
            if (pos + i < n && s + bit[pos + i] < k){
                pos += i;
                s += bit[pos];
            }
        }
        return pos + 1;
    }
};
const int N = 1e5 + 3;
vector<int> g[N];
int dep[N], heavy[N], par[N], head[N];
vector<pair<int, int>> chain[N]; // store in chain[head[u]]
void init(){
    auto dfs = [&](auto &dfs, int u, int pre) -> int {
        int sz = 1, mxsz = 0;
        for (int v : g[u]) if (v != pre){
            par[v] = u;
            dep[v] = dep[u] + 1;
            int csz = dfs(dfs, v, u);
            if (csz > mxsz){
                heavy[u] = v;
                mxsz = csz;
            }
            sz += csz;
        }
        return sz;
    };
    dfs(dfs, 1, 0);
    auto decompose = [&](auto &decompose, int u, int top) -> void {
        head[u] = top;
        if (heavy[u]) decompose(decompose, heavy[u], top);
        for (int v : g[u]) if (v != par[u] && v != heavy[u])
            decompose(decompose, v, v);
    };
    decompose(decompose, 1, 1);
}
// returns path from st -> 1 in compressed form
// also assigns all colors on path to x
vector<pair<int, int>> get(int st, int x){
    vector<pair<int, int>> res, cur;
    for (int u = st; u != 0; u = par[head[u]]){
        int h = dep[u] - dep[head[u]] + 1, tot = 0;
        cur.clear();
        while(!chain[head[u]].empty()){
            auto [col, cnt] = chain[head[u]].back();
            chain[head[u]].pop_back();
            tot += cnt;
            if (tot >= h){
                if (tot > h) chain[head[u]].emplace_back(col, tot - h);
                if (h - (tot - cnt) > 0) cur.emplace_back(col, h - (tot - cnt));
                break;
            }
            cur.emplace_back(col, cnt);
        }
        chain[head[u]].emplace_back(x, h);
        reverse(begin(cur), end(cur));
        for (auto p : cur)
            res.push_back(p);
    }
    return res;
}
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int n; cin >> n;
    vector<int> a(n + 1), compress;
    for (int i = 1; i <= n; ++i){
        cin >> a[i];
        compress.push_back(a[i]);
    }
    sort(begin(compress), end(compress));
    compress.erase(unique(begin(compress), end(compress)), end(compress));
    for (int i = 1; i <= n; ++i)
        a[i] = upper_bound(begin(compress), end(compress), a[i]) - begin(compress);
    vector<int> order;
    for (int i = 1, u, v; i < n; ++i){
        cin >> u >> v;
        g[u].push_back(v);
        order.push_back(v);
    }
    init();
    get(1, a[1]);
    Fenwick<long long> bit(compress.size());
    for (int u : order){
        auto seq = get(u, a[u]);
        reverse(begin(seq), end(seq));
        long long res = 0;
        for (auto [col, cnt] : seq){
            res += 1ll * cnt * bit.get(col + 1, compress.size());
            bit.update(col, cnt);
        }
        cout << res << '\n';
        for (auto [col, cnt] : seq){
            bit.update(col, -cnt);
        }
    }
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |