Untitled
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