Untitled

 avatar
unknown
c_cpp
a year ago
2.7 kB
13
Indexable
#include <bits/stdc++.h>

using namespace std;

#define ll long long

void FIO() {
#ifndef ONLINE_JUDGE
    freopen("../in.txt", "r", stdin);
    freopen("../out.txt", "w", stdout);
#endif
}

struct BIT {
    vector<int> tree;
    int n;

    BIT(int n = 0) : n(n), tree(n) {

    }

    void add(int idx, int val) {
        for (++idx; idx < n; idx += idx & -idx) {
            tree[idx] += val;
        }
    }

    int get(int idx) {
        int ret = 0;
        for (idx++; idx; idx -= (idx & -idx)) {
            ret += tree[idx];
        }
        return ret;
    }

    int get_range(int l, int r) {
        return get(r) - get(l - 1);
    }
};

const int N = 3e5 + 5;
const int L = 25;
vector<vector<int>> adj;
int tin[N], tout[N], timer, up[N][L], depth[N];

void dfs(int u, int p) {
    tin[u] = timer++;
    up[u][0] = p;
    for (int i = 1; i < L; i++) {
        up[u][i] = up[up[u][i - 1]][i - 1];
    }

    for (auto v: adj[u]) {
        if (v != p) {
            depth[v] = depth[u] + 1;
            dfs(v, u);
        }
    }

    tout[u] = timer++;
}

bool isAnc(int u, int v) {
    return tin[u] <= tin[v] && tout[v] <= tout[u];
}

int lca(int u, int v) {
    if (isAnc(u, v))
        return u;
    if (isAnc(v, u))
        return v;
    for (int i = L - 1; i >= 0; --i) {
        if (!isAnc(up[u][i], v))
            u = up[u][i];
    }
    return up[u][0];
}


void solve() {
    int n, q;
    cin >> n >> q;
    timer = 0;
    vector<pair<int, int>> a(n);
    for (int i = 0; i < n; ++i) {
        cin >> a[i].first;
        a[i].second = i;
    }

    adj.assign(n, {});
    for (int i = 0; i < n - 1; ++i) {
        int u, v;
        cin >> u >> v;
        --u, --v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    timer = 0;
    vector<array<int, 4>> queries;
    for (int i = 0; i < q; ++i) {
        int u, v, w;
        cin >> u >> v >> w;
        --u, --v;
        queries.push_back({w, u, v, i});
    }
    sort(a.rbegin(), a.rend());
    sort(queries.rbegin(), queries.rend());
    dfs(0, 0);
    BIT bit(timer + 10);
    int idx = 0;
    vector<int> ans(q);
    for (auto [w, u, v, i]: queries) {
        while (idx < n && a[idx].first > w) {
            int x = a[idx].second;
            bit.add(tin[x], 1);
            bit.add(tout[x], -1);
            ++idx;
        }
        int lc = lca(u, v);
        ans[i] = bit.get_range(tin[lc], tin[u]) + bit.get_range(tin[lc], tin[v]) - bit.get_range(tin[lc], tin[lc]);
    }
    for (auto x: ans) {
        cout << x << '\n';
    }
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    FIO();

    int t = 1;
    cin >> t;
    while (t--) {
        solve();
    }
    return 0;
}
Editor is loading...
Leave a Comment