Submission #1314099

#TimeUsernameProblemLanguageResultExecution timeMemory
1314099boclobanchatRegions (IOI09_regions)C++20
100 / 100
3585 ms85580 KiB
#include<bits/stdc++.h> using namespace std; const int MAXN=2e5+5; const int sqr=200; vector<int> vi[MAXN],ds[MAXN],vv[MAXN]; int L[MAXN],R[MAXN],pos[MAXN],cnt[MAXN],val[MAXN],dp[MAXN],ans[MAXN/sqr+5][MAXN/8],tdfs=0; void dfs(int i,int pre) { vi[val[i]].push_back(L[i]=++tdfs); vv[val[i]].push_back(i); for(auto v:ds[i]) if(v!=pre) dfs(v,i); R[i]=tdfs; } void dfs2(int i,int pre) { for(auto v:ds[i]) if(v!=pre) { dp[v]+=dp[i]; dfs2(v,i); } } int main() { int n,r,q; cin>>n>>r>>q; for(int i=1;i<=n;i++) { if(i>1) { int res; cin>>res; ds[res].push_back(i); } cin>>val[i]; cnt[val[i]]++; } int c=0; dfs(1,1); for(int i=1;i<=r;i++) if(cnt[i]>=sqr) { pos[++c]=i; for(int j=1;j<=n;j++) dp[j]=(val[j]==i); dfs2(1,1); for(int j=1;j<=n;j++) ans[c][val[j]]+=dp[j]; } for(int i=1;i<=q;i++) { int x,y; cin>>x>>y; if(cnt[x]>=sqr) { int p=lower_bound(pos+1,pos+c+1,x)-pos; cout<<ans[p][y]<<endl; } else { int a=0; for(auto v:vv[x]) { a+=(upper_bound(vi[y].begin(),vi[y].end(),R[v])-vi[y].begin()); a-=(lower_bound(vi[y].begin(),vi[y].end(),L[v])-vi[y].begin()); } cout<<a<<endl; } fflush(stdout); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...