#include <bits/stdc++.h>
// User: Kazuki_Will_Win_VOI_8703
using namespace std;
#define fi first
#define se second
#define pii pair<int, int>
#define ll long long
#define all(a) a.begin(), a.end()
const int mn = 2e5 + 5, lg = 20, inf = 1e5 + 5, mod = 1000000007, B = 320;
int n, m, q, on[mn], up[mn][lg], heavy[mn], d[mn], st[mn], ft[mn], euler[mn], timer_dfs = 0, ans[mn], lg2[mn];
vector <int> a[mn];
void pre_dfs(int u, int p){
st[u] = ++ timer_dfs;
d[u] = d[p] + 1;
euler[timer_dfs] = u;
for(auto v : a[u]){
if(v == p) continue;
pre_dfs(v, u);
euler[++ timer_dfs] = u;
}
ft[u] = timer_dfs;
}
int higher(int u, int v){
if(d[u] < d[v]) return u;
return v;
}
void build(){
for(int i = 1; i <= timer_dfs; i++) up[i][0] = euler[i];
for(int j = 1; j <= 17; j++){
for(int i = 1; i + (1 << j) <= timer_dfs; i++){
up[i][j] = higher(up[i][j - 1], up[i + (1 << (j - 1))][j - 1]);
}
}
lg2[0] = -1;
for(int i = 1; i <= timer_dfs; i++) lg2[i] = lg2[i / 2] + 1;
}
int lca(int u, int v){
if(st[u] > st[v]) swap(u, v);
int l = st[u], r = st[v], j = lg2[r - l + 1];
return higher(up[l][j], up[r - (1 << j) + 1][j]);
}
int kc(int u, int v){
int p = lca(u, v);
return d[u] + d[v] - 2 * d[p];
}
int cur = 0, freq[mn], bit[mn];
void add(int i, int v) {
for (; i <= timer_dfs; i += i & -i) bit[i] += v;
}
int get(int i) {
int s = 0;
for (; i > 0; i -= i & -i) s += bit[i];
return s;
}
int get_k(int k) {
int pos = 0, curr = 0;
for (int d = 1 << 21; d > 0; d >>= 1) {
if (pos + d <= timer_dfs && curr + bit[pos + d] < k) {
pos += d;
curr += bit[pos];
}
}
return pos + 1;
}
void add(int i){
int u = on[i];
freq[u] ++;
if(freq[u] == 1){
add(st[u], +1);
int cnt = get(timer_dfs);
int k = get(st[u]);
int prev_k = (k == 1 ? cnt : k - 1);
int next_k = (k == cnt ? 1 : k + 1);
int u_prev = euler[ get_k(prev_k) ];
int u_next = euler[ get_k(next_k) ];
cur -= kc(u_prev, u_next);
cur += kc(u_prev, u) + kc(u, u_next);
}
}
void del(int i){
int u = on[i];
freq[u] --;
if(freq[u] == 0){
int cnt = get(timer_dfs);
int k = get(st[u]);
int prev_k = (k == 1 ? cnt : k - 1);
int next_k = (k == cnt ? 1 : k + 1);
int u_prev = euler[get_k(prev_k)];
int u_next = euler[get_k(next_k)];
cur += kc(u_prev, u_next);
cur -= kc(u_prev, u) + kc(u, u_next);
add(st[u], -1);
}
}
struct Megumi{
int l, r, id;
bool operator< (const Megumi& other) const {
if(l / B == other.l / B) {
if((l / B) & 1) return r < other.r;
return r > other.r;
}
return l < other.l;
}
} e[mn];
void solve(){
cin >> n >> m >> q;
for(int i = 1; i < n; i++){
int u, v; cin >> u >> v;
a[u].push_back(v);
a[v].push_back(u);
}
pre_dfs(1, 0);
build();
for(int i = 1; i <= m; i++) cin >> on[i];
for(int i = 1; i <= q; i++){
cin >> e[i].l >> e[i].r;
e[i].id = i;
}
sort(e + 1, e + q + 1);
int ptrl = e[1].l, ptrr = e[1].r;
for(int i = e[1].l; i <= e[1].r; i++){
add(i);
}
// cerr << cur << '\n';
ans[e[1].id] = cur / 2;
for(int i = 2; i <= q; i++){
while(ptrl < e[i].l) del(ptrl ++);
while(ptrl > e[i].l) add(-- ptrl);
while(ptrr < e[i].r) add(++ ptrr);
while(ptrr > e[i].r) del(ptrr --);
ans[e[i].id] = cur / 2;
// cerr << e[i].id << ' ' << ans[e[i].id] << '\n';
}
for(int i = 1; i <= q; i++) cout << ans[i] + 1 << '\n';
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
if (fopen(".inp", "r")) {
freopen(".inp", "r", stdin);
freopen(".out", "w", stdout);
}
int t = 1;
// cin >> t;
while(t--) solve();
}
Compilation message (stderr)
tourism.cpp: In function 'int main()':
tourism.cpp:163:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
163 | freopen(".inp", "r", stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~
tourism.cpp:164:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
164 | freopen(".out", "w", stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~| # | 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... |