#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
template <class A, class B>
bool maximize(A &a, const B b) {
if (a < b) {
a = b;
return true;
} return false;
}
template <class A, class B>
bool minimize(A &a, const B b) {
if(a > b) {
a = b;
return true;
} return false;
}
using pII = pair <int, int>;
using vI = vector <int>;
using vL = vector <long long>;
using pLI = pair <long long, int>;
#define BIT(mask, i) ((mask >> (i)) & 1)
#define MASK(a) (1LL<<(a))
#define FOR(i, a, b) for(int i = a; i <= (int)b; i++)
#define FORD(i, a, b) for(int i = a; i >= (int)b; i--)
#define fi first
#define se second
#define pb push_back
#define all(a) a.begin(), a.end()
#define sz(a) (int)a.size()
const int N = 3e5 + 5;
const int LG = 22;
const int S = 550;
int n, m, q;
vector <int> g[N];
int c[N];
int hTour[N], nTour[N], timeDFS, tin[N], tout[N], h[N];
int rmq[N][LG], lg[N];
struct Queries{
int L, R, id;
bool operator <(const Queries &e) const{
if(L / S != e.L / S) return L < e.L;
if((R / S) & 1) return R < e.R;
return R > e.R;
}
} Q[N];
void dfs(int u, int p){
tin[u] = ++ timeDFS;
hTour[timeDFS] = h[u];
nTour[timeDFS] = u;
for(int &v : g[u]) if(v != p){
h[v] = h[u] + 1;
dfs(v, u);
hTour[++ timeDFS] = h[u];
nTour[timeDFS] = u;
}
}
int merge(int i, int j){
return hTour[i] < hTour[j] ? i : j;
}
int LCA(int u, int v){
if(tin[u] > tin[v]) swap(u, v);
int k = lg[tin[v] - tin[u] + 1];
int p = merge(rmq[tin[u]][k], rmq[tin[v] - (1 << k) + 1][k]);
return nTour[p];
}
int dist(int u, int v){
return h[u] + h[v] - 2 * h[LCA(u, v)];
}
set <pair <int, int>> set_euler;
int l = 1, r = 0, ans[N], res = 0, cnt[N];
void add (int u) {
cnt[tin[u]]++;
if (cnt[tin[u]] >= 2) return;
if (set_euler.empty()) {
set_euler.insert(make_pair(tin[u], u));
return;
}
auto nxt = set_euler.lower_bound(make_pair(tin[u], 0));
auto prv = nxt;
if (nxt == set_euler.end()) {
nxt = prev(nxt);
prv = set_euler.begin();
} else if (nxt == set_euler.begin()) {
prv = set_euler.end();
prv--;
} else {
prv = prev(nxt);
}
res-= dist (nxt -> second, prv -> second);
res+= dist (nxt -> second, u);
res+= dist (prv -> second, u);
set_euler.insert(make_pair(tin[u], u));
}
void del (int u) {
cnt[tin[u]]--;
if (cnt[tin[u]] >= 1) return;
if (set_euler.size() == 1) {
set_euler.clear();
return;
}
auto it = set_euler.lower_bound(make_pair(tin[u], u));
auto prv = it, nxt = it;
if (next(it) == set_euler.end()) {
prv = prev(it);
nxt = set_euler.begin();
} else if (it == set_euler.begin()) {
nxt = next(it);
prv = prev(set_euler.end());
} else {
nxt = next(it);
prv = prev(it);
}
res+= dist (nxt -> second, prv -> second);
res-= dist (nxt -> second, u);
res-= dist (prv -> second, u);
set_euler.erase(make_pair(tin[u], u));
}
void MO(int id){
while(l > Q[id].L) add(c[-- l]);
while(r < Q[id].R) add(c[++ r]);
while(l < Q[id].L) del(c[l ++]);
while(r > Q[id].R) del(c[r --]);
ans[Q[id].id] = res;
}
void process(){
cin >> n >> m >> q;
for(int i = 1; i < n; i++){
int u, v; cin >> u >> v;
g[u].pb(v); g[v].pb(u);
}
for(int i = 1; i <= m; i++){
cin >> c[i];
}
dfs(1, 1);
for(int i = 1; i <= timeDFS; i++){
rmq[i][0] = i;
if(i > 1) lg[i] = lg[i >> 1] + 1;
}
for(int j = 1; (1 << j) <= timeDFS; j++){
for(int i = 1; i <= timeDFS; i++){
rmq[i][j] = merge(rmq[i][j - 1], rmq[i + (1 << (j - 1))][j - 1]);
}
}
FOR(i, 1, q) cin >> Q[i].L >> Q[i].R, Q[i].id = i;
sort(Q + 1, Q + 1 + q);
FOR(i, 1, q) MO(i);
FOR(i, 1, q) cout << ans[i] / 2 + 1 << "\n";
}
int main(){
#define taskname "kieuoanh"
if(fopen(taskname".inp", "r")){
freopen(taskname".inp", "r", stdin); freopen(taskname".out", "w", stdout);
}
int tc = 1; /// cin >> tc;
while(tc--) process();
return 0;
}
Compilation message (stderr)
tourism.cpp: In function 'int main()':
tourism.cpp:166:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
166 | freopen(taskname".inp", "r", stdin); freopen(taskname".out", "w", stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
tourism.cpp:166:53: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
166 | freopen(taskname".inp", "r", stdin); freopen(taskname".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... |