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...