#include <bits/stdc++.h>
using namespace std;
#define foru(i,a,b) for(int i=(a); i<=(b); ++i)
#define ford(i,a,b) for(int i=(a); i>=(b); --i)
#define rep(i,a) for(int i=0; i<(a); ++i)
#define bit(s,i) (((s)>>(i))&1)
#define all(a) (a).begin(),(a).end()
#define sz(a) (int)(a).size()
#define ii pair<int,int>
#define fi first
#define se second
#define eb emplace_back
#define pb push_back
#define ll long long
#define __builtin_popcount(a) __builtin_popcountll(a)
template <class X, class Y> bool maxi(X &x, Y y){return x<y?x=y,true:false;}
template <class X, class Y> bool mini(X &x, Y y){return x>y?x=y,true:false;}
const int N=1e5+5;
int n,m,q;
vector<int> adj[N];
ii edge[N];
int sz[N],h[N],par[N];
void pre(int u, int p=-1){
sz[u]=1;
for(int v:adj[u]) if(v!=p){
h[v]=h[u]+1;
par[v]=u;
pre(v,u);
sz[u]+=sz[v];
}
}
int idCh[N],head[N],curCh;
int tin[N],lst[N],tim;
void hld(int u, int p=-1){
if(!head[curCh]){
head[curCh]=u;
}
idCh[u]=curCh;
tin[u]=++tim;
lst[u]=tim;
int bigCh=-1;
for(int v:adj[u]) if(v!=p){
if(bigCh==-1 || sz[bigCh]<sz[v]) bigCh=v;
}
if(bigCh!=-1) hld(bigCh,u);
for(int v:adj[u]) if(v!=p && v!=bigCh){
++curCh;
hld(v,u);
}
}
int fw[N];
void upd(int id, int val){
for(; id<=n; id+=id&-id) fw[id]+=val;
}
void updR(int l, int r, int val){
upd(l,val); upd(r+1,-val);
}
int get(int id){
int res=0;
for(; id>0; id-=id&-id) res+=fw[id];
return res;
}
/// phan chia ra hld -> de lay root hon
int cont[N],pass[N];
bool state[N],jump[N];
int getRoot(int u){
while(true){
if(jump[u]) u=par[u];
else{
int v=get(tin[u]);
if(u==v) break;
u=v;
}
}
return u;
}
void connect(int u, int v){
int rt=getRoot(u);
cont[rt]=cont[rt]+cont[v]-pass[v];
if(idCh[u]!=idCh[v]) jump[v]=1;
else{
rt=get(tin[u]);
updR(tin[v],lst[v],rt-v);
lst[rt]=lst[v];
}
}
void disconnect(int u, int v){
int rt=getRoot(u);
pass[v]=cont[v]=cont[rt];
if(idCh[u]!=idCh[v]) jump[v]=0;
else{
rt=get(tin[u]);
updR(tin[v],lst[rt],v-rt);
lst[v]=lst[rt]; lst[rt]=u;
}
}
void solve(){
cin>>n>>m>>q;
foru(i,1,n-1){
int u,v;cin>>u>>v;
edge[i]={u,v};
adj[u].eb(v);adj[v].eb(u);
}
pre(1);
hld(1);
foru(i,1,n-1){
if(tin[edge[i].fi]>tin[edge[i].se]) swap(edge[i].fi, edge[i].se);
}
foru(i,1,n) cont[i]=1;
foru(i,1,n) updR(tin[i],tin[i],i);
foru(_,1,m){
int d; cin>>d;
int u=edge[d].fi, v=edge[d].se;
if(!state[d]){
connect(u,v);
} else{
disconnect(u,v);
}
state[d]^=1;
}
foru(_,1,q){
int c; cin>>c;
cout<<cont[getRoot(c)]<<'\n';
}
}
int32_t main(){
#define task "test"
if(fopen(task".inp","r")){
freopen(task".inp","r",stdin);
freopen(task".out","w",stdout);
}
cin.tie(0)->sync_with_stdio(0);
solve();
}
Compilation message (stderr)
synchronization.cpp: In function 'int32_t main()':
synchronization.cpp:152:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
152 | freopen(task".inp","r",stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
synchronization.cpp:153:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
153 | freopen(task".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... |