Submission #661131

#TimeUsernameProblemLanguageResultExecution timeMemory
661131amirhoseinfar1385Regions (IOI09_regions)C++17
100 / 100
3432 ms71716 KiB
#include<bits/stdc++.h> using namespace std; const int sq=(int)sqrt(200000+5),maxn=200000+5,maxr=25000+5,maxq=200000+5; int now=0,valdfs[maxn],val[maxn],par[maxn],wr[maxr],allrsq[maxr][sq]; vector<int>allr[maxr],fallr[maxr]; pair<int,int>stf[maxn]; vector<int>adj[maxn]; vector<int>allbs; int n,r,q,t=1; bool cmp(int a,int b){ return stf[a].first<stf[b].first; } void aval(int u=1){ t++; stf[u].first=t; for(auto x:adj[u]){ aval(x); } t++; stf[u].second=t; } void dovom(){ for(int i=1;i<=r;i++){ if(allr[i].size()>=sq){ allbs.push_back(i); wr[i]=(int)allbs.size()-1; } } } void dfs(int u=1){ valdfs[u]+=valdfs[par[u]]; allrsq[val[u]][now]+=valdfs[u]; for(auto x:adj[u]){ dfs(x); } } void sevom(){ for(int i=0;i<(int)allbs.size();i++){ now=i; for(auto x:allr[allbs[i]]){ valdfs[x]=1; } dfs(); for(int i=0;i<maxn;i++){ valdfs[i]=0; } } } int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n>>r>>q; for(int i=1;i<=n;i++){ if(i==1){ int d; cin>>d; par[i]=0; val[i]=d; allr[d].push_back(i); continue; } int p,d; cin>>p>>d; par[i]=p; adj[p].push_back(i); val[i]=d; allr[d].push_back(i); } aval(); dovom(); sevom(); for(int i=0;i<maxr;i++){ sort(allr[i].begin(),allr[i].end(),cmp); for(auto x:allr[i]){ fallr[i].push_back(stf[x].first); } } for(int asd=0;asd<q;asd++){ int u,v; cin>>u>>v; if(allr[u].size()>=sq){ cout<<allrsq[v][wr[u]]<<endl; continue; } else{ int res=0; for(auto x:allr[u]){ int ff=upper_bound(fallr[v].begin(),fallr[v].end(),stf[x].first)-fallr[v].begin(); int fl=upper_bound(fallr[v].begin(),fallr[v].end(),stf[x].second)-fallr[v].begin(); res+=fl-ff; } cout<<res<<endl; } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...