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