Submission #1244295

#TimeUsernameProblemLanguageResultExecution timeMemory
1244295whtthRegions (IOI09_regions)C++20
100 / 100
2711 ms30428 KiB
#include<bits/stdc++.h> #pragma GCC optimize("O3") using namespace std; int n, m, r, k, ans=0, x, y, z, st[200010], en[200010], timer=0, qg[200010], block=447; vector<int> ke[200010]; vector<int> f[25001]; vector<int> g[25001]; vector<int> hev[25001]; void dfs(int u, int t){ st[u]=++timer; f[qg[u]].push_back(st[u]); g[qg[u]].push_back(u); for(int v : ke[u]){ if(v!=t){ dfs(v, u); } } en[u]=timer; } void dfs2(int u, int p, int sum, int target){ if(qg[u]==target)sum++; hev[x][qg[u]]+=sum; for(int v : ke[u]){ if(v==p)continue; dfs2(v, u, sum, target); } } bool cmp(int a, int b){ return st[a]<st[b]; } int main(){ ios::sync_with_stdio(0);cin.tie(nullptr); cin>>n>>r>>m; for(int i=1;i<=n;i++){ int x, y; if(i!=1){ cin>>x; ke[x].push_back(i); } cin>>qg[i]; } dfs(1, 0); for(int i=1;i<=m;i++){ cin>>x>>y; if(g[x].size()<=block){ int ans=0; for(int u : g[x]){ auto itL = lower_bound(f[y].begin(), f[y].end(), st[u]); auto itR = upper_bound(f[y].begin(), f[y].end(), en[u]); ans += (itR - itL); } cout<<ans<<endl; } else { if(hev[x].empty()){ hev[x].resize(r+1, 0); dfs2(1, 0, 0, x); } cout<<hev[x][y]<<endl; } } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...