Submission #1178763

#TimeUsernameProblemLanguageResultExecution timeMemory
1178763AlgorithmWarriorSynchronization (JOI13_synchronization)C++20
100 / 100
283 ms23064 KiB
#include <bits/stdc++.h>

using namespace std;

int const LOG=20;
int const MAX=100005;
vector<int>tree[MAX];
int n,m,q;
int x[MAX],y[MAX];
int tin[MAX],tout[MAX];
int lift[MAX][LOG];
int cardN[MAX],cardM[MAX];
bool activ[MAX];

int ub(int x){
    return x&(-x);
}

struct AIB{
    int v[MAX];
    void add(int pos,int val){
        while(pos<=n){
            v[pos]+=val;
            pos+=ub(pos);
        }
    }
    int sum(int pos){
        int s=0;
        while(pos){
            s+=v[pos];
            pos-=ub(pos);
        }
        return s;
    }
}aib;

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);
        tree[v].push_back(u);
        x[i]=u;
        y[i]=v;
    }
}

void dfs(int nod){
    int i;
    for(i=1;i<LOG;++i)
        lift[nod][i]=lift[lift[nod][i-1]][i-1];
    static int time=0;
    tin[nod]=++time;
    for(auto fiu : tree[nod])
        if(fiu!=lift[nod][0]){
            lift[fiu][0]=nod;
            dfs(fiu);
        }
    tout[nod]=time;
}

void init(){
    int i;
    for(i=1;i<=n;++i)
        cardN[i]=1;
    for(i=1;i<n;++i)
        if(lift[x[i]][0]==y[i])
            swap(x[i],y[i]);
    for(i=1;i<=n;++i){
        aib.add(tin[i],1);
        aib.add(tout[i]+1,-1);
    }
}

int rad(int nod){
    int i;
    for(i=LOG-1;i>=0;--i)
        if(aib.sum(tin[nod])==aib.sum(tin[lift[nod][i]]))
            nod=lift[nod][i];
    return nod;
}

void process_changes(){
    int i;
    for(i=1;i<=m;++i){
        int id;
        cin>>id;
        if(activ[id]){
            int root=rad(y[id]);
            cardN[y[id]]=cardN[root];
            cardM[id]=cardN[root];
            aib.add(tin[y[id]],1);
            aib.add(tout[y[id]]+1,-1);
            activ[id]=0;
        }
        else{
            aib.add(tin[y[id]],-1);
            aib.add(tout[y[id]]+1,1);
            int root=rad(y[id]);
            cardN[root]+=cardN[y[id]]-cardM[id];
            activ[id]=1;
        }
    }
}

void process_queries(){
    int i;
    for(i=1;i<=q;++i){
        int qry;
        cin>>qry;
        int root=rad(qry);
        cout<<cardN[root]<<'\n';
    }
}

int main()
{
    read();
    dfs(1);
    init();
    process_changes();
    process_queries();
    return 0;
}
#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...