Submission #499575

#TimeUsernameProblemLanguageResultExecution timeMemory
499575couplefireSynchronization (JOI13_synchronization)C++17
100 / 100
268 ms24176 KiB
#include <bits/stdc++.h>
using namespace std;

const int N = 100005;

int n, m, q, uu[N], vv[N], bit[N], lst[N], ans[N];
vector<int> adj[N];
int up[N][20], tin[N], tout[N], tid;

void upd(int pos, int val){
    for(; pos<N; pos=pos|(pos+1))
        bit[pos] += val;
}

int query(int pos){
    int res = 0;
    for(; pos>=0; pos=(pos&(pos+1))-1)
        res += bit[pos];
    return res;
}

void dfs(int v, int p){
    tin[v] = tid++;
    up[v][0] = p;
    for(int i = 1; i<20; ++i)
        up[v][i] = up[v][i-1]==-1?-1:up[up[v][i-1]][i-1];
    for(auto u : adj[v])
        if(u!=p) dfs(u, v);
    tout[v] = tid;
}

int get(int v){
    int a = query(tin[v]), b = v;
    for(int i = 19; i>=0; --i)
        if(up[b][i]!=-1 && query(tin[up[b][i]])==a)
            b = up[b][i];
    return b;
}

int main(){
    // freopen("a.in", "r", stdin);
    cin.tie(0)->sync_with_stdio(0);
    cin >> n >> m >> q;
    for(int i = 0; i<n-1; ++i){
        cin >> uu[i] >> vv[i]; --uu[i], --vv[i];
        adj[uu[i]].push_back(vv[i]);
        adj[vv[i]].push_back(uu[i]);
    }
    dfs(0, -1);
    for(int i = 0; i<n-1; ++i)
        if(up[uu[i]][0]==vv[i])
            swap(uu[i], vv[i]);
    for(int i = 0; i<n; ++i)
        upd(tin[i], 1), upd(tout[i], -1), ans[i] = 1;
    for(int i = 0; i<m; ++i){
        int id; cin >> id; --id;
        int u = uu[id], v = vv[id];
        u = get(u);
        if(lst[id]==-1){
            upd(tin[v], 1); upd(tout[v], -1);
            lst[id] = ans[v] = ans[u];
        } else{
            upd(tin[v], -1); upd(tout[v], 1);
            int tmp = ans[u]+ans[v]-lst[id];
            ans[u] = ans[v] = tmp; lst[id] = -1;
        }
    }
    while(q--){
        int v; cin >> v; --v;
        cout << ans[get(v)] << '\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...