Submission #730354

#TimeUsernameProblemLanguageResultExecution timeMemory
730354NintsiChkhaidzeRegions (IOI09_regions)C++17
95 / 100
6524 ms131072 KiB
#include <bits/stdc++.h> #define f first #define s second #define pb push_back #define ll long long using namespace std; const int N = 2e5+5,Bl=505,C = 200000/(Bl - 5) + 5; vector <int> v[N],st[25005]; vector <ll> ynull; int r[N],tin[N],tout[N],id[25005]; int fen[N],B,r1,r2,timer; ll k[C][25005],DP[C][25005],ans; bool big[25005]; int get(int idx){ int s=0; while(idx){ s+=fen[idx]; idx -= (idx&(-idx)); } return s; } void upd(int idx,int val){ while (idx <= 200000){ fen[idx] += val; idx += (idx & (-idx)); } } vector <ll> dfs(int x,int par, vector <ll> P){ tin[x] = ++timer; vector <ll> vec = ynull,Pnew = ynull; if (x != 1){ for (int i=0;i<B;i++) Pnew[i] += P[i]; if (big[r[par]]) Pnew[id[r[par]] - 1]++; } vector <ll> o; for (int to: v[x]) if (to != par) { o = dfs(to,x,Pnew); for (int i = 0; i < B; i++) vec[i] += o[i]; if (big[r[to]]) vec[id[r[to]] - 1]++; } for (int i=0;i<B;i++){ k[i+1][r[x]] += vec[i]; DP[i+1][r[x]] += Pnew[i]; } tout[x] = timer; return vec; } signed main (){ ios_base::sync_with_stdio(0),cin.tie(NULL),cout.tie(NULL); int n,R,q; cin>>n>>R>>q; cin>>r[1]; st[r[1]].pb(1); for(int i=2;i<=n;i++){ cin>>r1>>r[i]; st[r[i]].pb(i); v[r1].pb(i); v[i].pb(r1); } B = 0; for (int i = 1; i <= R; i++){ if ((int)st[i].size() > Bl){ ++B; id[i] = B; big[i] = 1; } } for (int i=0;i<B;i++) ynull.pb(0); dfs(1,1,ynull); while (q--){ cin>>r1>>r2; if (!big[r1] && !big[r2]){ ans=0; for (int x: st[r2]) upd(tin[x],1); for (int x: st[r1]) ans += get(tout[x]) - get(tin[x] - 1); for (int x: st[r2]) upd(tin[x],-1); cout<<ans<<endl; }else if (big[r2]){ cout<<k[id[r2]][r1]<<endl; }else{ cout<<DP[id[r1]][r2]<<endl; } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...