Submission #1343420

#TimeUsernameProblemLanguageResultExecution timeMemory
1343420WarinchaiRegions (IOI09_regions)C++20
100 / 100
2501 ms32912 KiB
#include<bits/stdc++.h>
using namespace std;

vector<int>adj[200005];
int ar[200005];
int cnt[200005];
int ans[505][200005];
int tot;
int X=500;
vector<int>v[200005];
vector<int>v2[200005];
int in[200005];
int out[200005];
int tme=0;
vector<int>big;

void dfs(int u,int t,int tt){
    ans[t][ar[u]]+=tot;
    if(ar[u]==tt)tot++;
    for(auto x:adj[u])dfs(x,t,tt);
    if(ar[u]==tt)tot--;
}

void efs(int u){
    in[u]=++tme;
    //cerr<<"u:"<<u<<" "<<in[u]<<"\n";
    v[ar[u]].push_back(tme);
    v2[ar[u]].push_back(u);
    for(auto x:adj[u])efs(x);
    out[u]=tme;
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int n,r,q;cin>>n>>r>>q;
    for(int i=1;i<=n;i++){
        if(i==1)cin>>ar[i];
        else{
            int x;cin>>x;
            adj[x].push_back(i);
            cin>>ar[i];
            cnt[ar[i]]++;
        }
    }
    int cur=0;
    for(int i=1;i<=r;i++){
        if(cnt[i]>X){
            big.push_back(i);
            dfs(1,cur,i);
            cur++;
        }
    }
    efs(1);
    for(int i=0;i<q;i++){
        int r1,r2;cin>>r1>>r2;
        if(cnt[r1]>X){
            r1=lower_bound(big.begin(),big.end(),r1)-big.begin();
            cout<<ans[r1][r2]<<endl;
        }else{
            int rans=0;
            for(auto x:v2[r1]){
                //cerr<<"add:"<<in[x]+1<<" "<<out[x]<<"\n";
                int st=upper_bound(v[r2].begin(),v[r2].end(),in[x])-v[r2].begin()+1;
                int en=upper_bound(v[r2].begin(),v[r2].end(),out[x])-v[r2].begin();
                rans+=max(0,en-st+1);
            }
            cout<<rans<<endl;
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...