#include <bits/stdc++.h>
#define ll int64_t
#define ld long double
using namespace std;
//
const int maxn =1e5+5;
const int mod = 1e9+7; // 998244353,1610612741
const ll inf = 1e18;
const ld pi = atan(1.0L)*4;
int n,m,q,tin[maxn],tout[maxn],cur;
pair<int,int> e[maxn];
vector<int> g[maxn];
int h[maxn],st[maxn][20];
int bit[maxn],res[maxn],pre[maxn];
bool has[maxn];
void update(int i,int x) {
for (;i<=n;i+=i&-i) bit[i]+=x;
}
int query(int i){
int res=0;
for (;i>0;i-=i&-i) res+=bit[i];
return res;
}
void dfs(int u){
tin[u]=++cur;
for (auto v:g[u]) {
if (st[u][0]==v) continue;
h[v]=h[u]+1;
st[v][0]=u;
for (int i=1;i<=17;i++) st[v][i]=st[st[v][i-1]][i-1];
dfs(v);
}
tout[u]=cur;
}
int calc(int u,int k){
for (int i=0;(1<<i)<=k;i++) {
if (k&(1<<i)) u=st[u][i];
}
return u;
}
void up(int id) {
int u=e[id].first,v=e[id].second;
if (h[u]>h[v]) swap(u,v);
int w=calc(u,query(tin[u]));
if (!has[id]) {
res[w]+=res[v]-pre[v];
update(tin[v],1);
update(tout[v]+1,-1);
}
else{
res[v]=pre[v]=res[w];
update(tin[v],-1);
update(tout[v]+1,1);
}
has[id]^=1;
}
int main() {
// freopen("../input.inp","r",stdin);
// freopen("output.out","w",stdout);
ios::sync_with_stdio(false);
cin.tie(nullptr);
clock_t start,end;
start=clock();
cin>>n>>m>>q;
for (int i=1;i<=n;i++) res[i]=1;
for (int i=1;i<n;i++) {
int u,v;
cin >>u>>v;
e[i]={u,v};
g[u].push_back(v);
g[v].push_back(u);
}
dfs(1);
while (m--) {
int id;
cin >>id;
up(id);
}
for (int i=1;i<n;i++) {
if (has[i]) up(i);
}
while (q--) {
int u;cin >>u;
cout <<res[u]<<'\n';
}
end=clock();
ld dur=(ld)(end-start)/(ld)(CLOCKS_PER_SEC)*(1000.0L);
cerr<<dur<<'\n';
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... |