#include <bits/stdc++.h>
using namespace std;
int const MAX=100005;
struct edge{
int nod,id;
};
vector<edge>tree[MAX];
int n,m,q;
vector<int>pos[MAX];
int dp[MAX];
int root;
int rasp;
void read(){
cin>>n>>m>>q;
int i;
for(i=1;i<n;++i){
int u,v;
cin>>u>>v;
tree[u].push_back({v,i});
tree[v].push_back({u,i});
}
for(i=1;i<=m;++i){
int muchie;
cin>>muchie;
pos[muchie].push_back(i);
}
cin>>root;
}
void dfs(int nod,int tata,int id_edge){
if(nod==root)
dp[nod]=m;
else{
int ind=upper_bound(pos[id_edge].begin(),pos[id_edge].end(),dp[tata])-pos[id_edge].begin();
if(ind){
if(ind%2==0)
dp[nod]=pos[id_edge][ind-1]-1;
else
dp[nod]=dp[tata];
}
}
if(dp[nod])
++rasp;
for(auto [fiu,id] : tree[nod])
if(fiu!=tata)
dfs(fiu,nod,id);
}
int main()
{
read();
dfs(root,0,0);
cout<<rasp;
return 0;
}
# | 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... |