#include <bits/stdc++.h>
#define fi first
#define se second
#define maxn 100005
using namespace std;
using ii = pair<int, int>;
int n, m, q, d[maxn], c[maxn], id = 0, euler[maxn];
vector<int> adj[maxn];
int f[18][maxn];
void pfs(int u, int dad) {
f[0][u] = dad;
euler[u] = ++id;
for (int i = 1; i <= 17; i++) f[i][u] = f[i-1][f[i-1][u]];
for (int v : adj[u])
if (v != dad) {
d[v] = d[u] + 1;
pfs(v, u);
}
}
int lca(int u, int v) {
function<int(int, int)> jump = [&](int x, int k) {
for (int i = 0; i <= 17; i++) if (k>>i&1) x = f[i][x];
return x;
};
if (d[u] > d[v]) swap(u, v);
if (d[u] < d[v]) v = jump(v, d[v]-d[u]);
if (u == v) return u;
for (int i = 17; i >= 0; i--)
if (f[i][u] != f[i][v]) {
u = f[i][u];
v = f[i][v];
}
return f[0][u];
}
int dis(int u, int v) {
return d[u] + d[v] - 2 * d[lca(u, v)];
}
void solve() {
int l, r;
cin >> l >> r;
vector<int> a;
for (int i = l; i <= r; i++) a.emplace_back(c[i]);
sort(a.begin(), a.end(), [&](int x, int y) {return euler[x] < euler[y];});
int ans = 0;
for (int i = 1; i < a.size(); i++) ans += dis(a[i], a[i-1]);
ans += dis(a[0], a.back());
cout << ans / 2 + 1 << "\n";
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> n >> m >> q;
for (int i = 1; i < n; i++) {
int u, v;
cin >> u >> v;
adj[u].emplace_back(v);
adj[v].emplace_back(u);
}
pfs(1, 0);
for (int i = 1; i <= m; i++) cin >> c[i];
while (q--) solve();
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |