#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ld long double
#define show(x,y) cout << y << " " << #x << endl;
#define show2(x,y,i,j) cout << y << " " << #x << " " << j << " " << #i << endl;
#define show3(x,y,i,j,p,q) cout << y << " " << #x << " " << j << " " << #i << " " << q << " " << #p << endl;
#define show4(x,y) for(auto it:y) cout << it << " "; cout << #x << endl;
typedef pair<int,int>pii;
typedef pair<pii,int>pi2;
mt19937_64 rng(chrono::system_clock::now().time_since_epoch().count());
vector<int>adj[100005];
int d[100005];
int sz[100005];
void dfs(int index, int par){
if(adj[index].size()>1&&adj[index][0]==par) swap(adj[index][0],adj[index][1]);
sz[index]=1;
for(auto &it:adj[index]){
if(it==par) continue;
d[it]=d[index]+1;
dfs(it,index);
sz[index]+=sz[it];
if(sz[it]>sz[adj[index][0]]) swap(it,adj[index][0]);
}
}
int hp[100005];
int pp[100005];
int in[100005];
int out[100005];
int ptr=0;
void hld(int index, int par){
in[index]=++ptr;
for(auto it:adj[index]){
if(it==par) continue;
if(it==adj[index][0]) hp[it]=hp[index];
else hp[it]=it;
pp[it]=index;
hld(it,index);
}
out[index]=ptr;
}
set<pi2>se[100005];
int fw[100005];
void upd(int x, int y){
while(x<100005){
fw[x]+=y;
x+=x&(-x);
}
}
int sum(int x){
int counter=0;
while(x>0){
counter+=fw[x];
x-=x&(-x);
}
return counter;
}
int query(int x, int y){
return sum(y)-sum(x-1);
}
void add(int l, int r, int c, int index){
//interval set
//cout << l << " " << r << " " << c << " " << index << " add" << endl;
//for(auto it:se[index]){
//cout << it.first.second << " " << it.first.first << " " << it.second << " se\n";
//}
while(1){
auto it=se[index].lower_bound({{l,0},0});
if(it==se[index].end()) break;
pi2 hold=*it;
int lft=hold.first.second;
int rgt=hold.first.first;
if(lft>r) break;
se[index].erase(se[index].find(hold));
upd(hold.second,-(rgt-lft+1));
if(lft<l){
se[index].insert({{l-1,lft},hold.second});
upd(hold.second,((l-1)-lft+1));
}
if(rgt>r){
se[index].insert({{rgt,r+1},hold.second});
upd(hold.second,(rgt-(r+1)+1));
}
}
se[index].insert({{r,l},c});
upd(c,r-l+1);
}
void solve(){
int n,m,q;
cin >> n >> m >> q;
int temp,temp2;
for(int x=0;x<n-1;x++){
cin >> temp >> temp2;
adj[temp].push_back(temp2);
adj[temp2].push_back(temp);
}
dfs(1,-1);
hp[1]=1;
hld(1,-1);
int take[m+5];
for(int x=1;x<=m;x++){
cin >> take[x];
}
vector<pii>storage[m+5];
int ans[q];
for(int x=0;x<q;x++){
cin >> temp >> temp2;
storage[temp2].push_back({temp,x});
}
//for(int x=1;x<=n;x++){
//cout << hp[x] << " ";
//}
//cout << "\n";
for(int x=1;x<=m;x++){
if(x>1){
//path
int prev=take[x-1];
int cur=take[x];
while(hp[prev]!=hp[cur]){
if(d[hp[prev]]>d[hp[cur]]) swap(prev,cur);
//cur is deeper
add(in[hp[cur]],in[cur],x-1,hp[cur]);
cur=pp[hp[cur]];
//for(int y=1;y<=x;y++){
//cout << query(y,y) << " ";
//}
//cout << "before" << endl;
}
if(in[cur]>=in[prev]) swap(cur,prev);
add(in[cur],in[prev],x-1,hp[cur]);
}
//for(int y=1;y<=x;y++){
//cout << query(y,y) << " ";
//}
//cout << "before" << endl;
add(in[take[x]],in[take[x]],x,hp[take[x]]);
for(auto it:storage[x]){
ans[it.second]=query(it.first,x);
}
//show(x,x);
//for(int y=1;y<=x;y++){
//cout << query(y,y) << " ";
//}
//cout << " fw" << endl;
}
for(int x=0;x<q;x++) cout << ans[x] << "\n";
}
int32_t main(){
ios::sync_with_stdio(0);
cin.tie(0);
//freopen("in.txt","r",stdin);
//freopen("in.txt","w",stdout);
int t=1;
//cin >> t;
while(t--){
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... |