Submission #274226

#TimeUsernameProblemLanguageResultExecution timeMemory
274226LifeHappen__Synchronization (JOI13_synchronization)C++14
100 / 100
437 ms38820 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(v,a) for(auto &v:a)
#define ii pair<int,int>
#define fi first
#define se second
#define pb push_back
#define all(a) begin(a),end(a)

const int N=2e5+5;
int n,m,q,st[N],en[N],id;
vector<int> ad[N];
ii edge[N];
int pd[N][21],it[N],act[N],a[N],last[N];

void dfs(int u,int par){
    forinc(i,1,20) pd[u][i]=pd[pd[u][i-1]][i-1];
    st[u]=++id;
    a[u]=1;
    forv(v,ad[u]) if(v!=par){
        pd[v][0]=u;
        dfs(v,u);
    }
    en[u]=id;
}
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 l,int r,int val){
        //cerr<<l<<' '<<r+1<<'\n';
    upd(l,val);
    upd(r+1, -val);
}
int root(int x){
    fordec(i,20,0) if(pd[x][i]!=0 && get(st[pd[x][i]])==get(st[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){
        cin>>edge[i].fi>>edge[i].se;
        ad[edge[i].fi].pb(edge[i].se);
        ad[edge[i].se].pb(edge[i].fi);
    }
    dfs(1,0);
    //forinc(i,1,n) cout<<st[i]<<'\n';
    forinc(i,1,n) up(st[i],en[i],1);
    while(m--){
        int now;
        cin>>now;
        int u,v;
        tie(u,v)=edge[now];
        //cerr<<u<<' '<<v<<'\n';
        if(pd[u][0]==v) swap(u,v);
        if(act[now]){
            a[v]=last[v]=a[root(u)];
            up(st[v],en[v],1);
        } else{
            a[root(u)]+=a[v]-last[v];
            up(st[v],en[v],-1);
        }
        act[now]=!act[now];
    }
    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...