Submission #644865

#TimeUsernameProblemLanguageResultExecution timeMemory
644865ono_de206Synchronization (JOI13_synchronization)C++14
100 / 100
488 ms23616 KiB
#include<bits/stdc++.h> using namespace std; #define fast ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define in insert #define all(x) x.begin(),x.end() #define pb push_back #define eb emplace_back #define ff first #define ss second const int mxn=2e5+10; int n; int in[mxn],out[mxn],sub[mxn],dth[mxn],par[mxn],anc[mxn]; int is[mxn]; vector<int> g[mxn]; int d[mxn*4],seg[mxn]; int ans[mxn],alr[mxn]; void dfs1(int to,int fr) { sub[to]=1; par[to]=fr; ans[to]=1; for(int x : g[to]) { if(x==fr) continue; dfs1(x,to); sub[to]+=sub[x]; } } int t; void dfs2(int to,int top) { t++; in[to]=t; seg[t]=to; anc[to]=top; int mx=-1,idx=-1; for(int x : g[to]) { if(x==par[to]) continue; if(sub[x]>mx) { mx=sub[x]; idx=x; } } if(idx==-1) { out[to]=t; return; } dfs2(idx,top); for(int x : g[to]) { if(x==par[to] || x==idx) continue; dfs2(x,x); } out[to]=t; } void build(int l,int r,int i) { if(l==r) { d[i]=1; return; } int m=(l+r)/2; build(l,m,i*2); build(m+1,r,i*2+1); d[i]=d[i*2]+d[i*2+1]; } void update(int l,int r,int i,int x) { if(l==r) { d[i]^=1; return; } int m=(l+r)/2; if(x>m) update(m+1,r,i*2+1,x); if(x<=m) update(l,m,i*2,x); d[i]=d[i*2+1]+d[i*2]; } int sum(int l,int r,int i,int x,int y) { if(l>y || r<x) return 0; if(l>=x && r<=y) return d[i]; int m=(l+r)/2; return sum(l,m,i*2,x,y)+sum(m+1,r,i*2+1,x,y); } int query(int l,int r,int i,int x,int y) { if(l==r) { if(d[i]==1) return seg[l]; else return -1; } int m=(l+r)/2; if(y<=m) return query(l,m,i*2,x,y); if(x>m) return query(m+1,r,i*2+1,x,y); int tmp=sum(1,n,1,m+1,y); if(tmp) return query(m+1,r,i*2+1,x,y); else return query(l,m,i*2,x,y); } int get_anc(int x) { while(1) { int tmp=sum(1,n,1,in[anc[x]],in[x]); if(tmp==0) { x=par[anc[x]]; continue; } return query(1,n,1,in[anc[x]],in[x]); } return -1; } int main() { fast; int m,q; cin>>n>>m>>q; vector<pair<int,int>> edge; for(int i=2; i<=n; i++) { int x,y; cin>>x>>y; edge.pb({x,y}); g[x].pb(y); g[y].pb(x); } dfs1(1,0); dfs2(1,1); build(1,n,1); for(int i=1; i<=m; i++) { int x; cin>>x; x--; if(par[edge[x].ss]==edge[x].ff) swap(edge[x].ss,edge[x].ff); if(is[x]==1) { int ances=get_anc(edge[x].ss); alr[edge[x].ff]=ans[edge[x].ff]=ans[ances]; update(1,n,1,in[edge[x].ff]); } else { int ances=get_anc(edge[x].ss); ans[ances]+=ans[edge[x].ff]-alr[edge[x].ff]; update(1,n,1,in[edge[x].ff]); } is[x]^=1; } for(;q--;) { int x; cin>>x; cout<<ans[get_anc(x)]<<'\n'; } 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...