Submission #274765

#TimeUsernameProblemLanguageResultExecution timeMemory
274765LifeHappen__Synchronization (JOI13_synchronization)C++14
100 / 100
423 ms40312 KiB
#include <bits/stdc++.h>

using namespace std;

#define int long long
#define forinc(a,b,c) for(int a=b, _c=c; a<=_c; ++a)
#define fordec(a,b,c) for(int a=b, _c=c; a>=_c; --a)
#define forv(a,b) for(auto &a:b)
#define ii pair<int,int>
#define fi first
#define se second
#define pb push_back
#define all(a) begin(a),end(a)
#define rall(a) rbegin(a),rend(a)

const int N=2e5+5;
int n,m,q;
ii edge[N];
vector<int> ad[N];
int tin[N],tout[N],id,it[N],a[N],last[N],dd[N];
int pd[N][23];

void upd(int i,int val){
    for(; i<=n; i+=i&-i) it[i]+=val;
}
int get(int i){
    int ans=0;
    for(; i; i-=i&-i) ans+=it[i];
    return ans;
}
void up(int u,int v,int val){
    upd(u,val); upd(v+1,-val);
}

void dfs(int u,int par=-1){
    tin[u]=++id;
    forinc(i,1,22) pd[u][i]=pd[pd[u][i-1]][i-1];
    a[u]=1;
    forv(v,ad[u]) if(v!=par){
        pd[v][0]=u;
        dfs(v,u);
    }
    tout[u]=id;
}
int root(int x){
    fordec(i,22,0) if(pd[x][i] && get(tin[pd[x][i]])==get(tin[x])) x=pd[x][i];
    return x;
}


int32_t main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    cin>>n>>m>>q;
    forinc(i,1,n-1){
        int u,v;
        cin>>u>>v;
        ad[u].pb(v); ad[v].pb(u);
        edge[i]={u,v};
    }
    dfs(1,0);
    forinc(i,1,n) up(tin[i],tout[i],1);
    while(m--){
        int x;
        cin>>x;
        int u,v; tie(u,v)=edge[x];
        if(pd[u][0]==v) swap(u,v);
        if(!dd[x]){
            a[root(u)]+=a[v]-last[v];
            up(tin[v],tout[v],-1);
        }else{
            a[v]=last[v]=a[root(u)];
            up(tin[v],tout[v],1);
        }
        dd[x]=!dd[x];
    }
    while(q--){
        int x;
        cin>>x;
        cout<<a[root(x)]<<'\n';
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...