Submission #730332

#TimeUsernameProblemLanguageResultExecution timeMemory
730332NintsiChkhaidzeRegions (IOI09_regions)C++17
50 / 100
2116 ms99068 KiB
#include <bits/stdc++.h> #define f first #define s second #define pb push_back using namespace std; const int N = 2e5+5,Bl=165; vector <int> v[N],st[25005]; int r[N],tin[N],tout[N],cnt[25005],timer,id[25005]; int fen[N],B,k[25005][Bl],DP[Bl][N]; 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 <int> dfs(int x,int par){ tin[x] = ++timer; vector <int> vec; vec.clear(); for (int i=0;i<B;i++) vec.pb(0); if (x != 1){ for (int i = 1; i <= B; i++) DP[i][x] += DP[i][par]; if (big[r[par]]) DP[id[r[par]]][x]++; } for (int to: v[x]) if (to != par) { vector <int> o = dfs(to,x); 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[r[x]][i + 1] += vec[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]; cnt[r[1]]++; st[r[1]].pb(1); for(int i=2;i<=n;i++){ int p; cin>>p>>r[i]; cnt[r[i]]++; st[r[i]].pb(i); v[p].pb(i); v[i].pb(p); } B = 0; for (int i = 1; i <= R; i++){ if (cnt[i] > Bl){ ++B; id[i] = B; big[i] = 1; } } dfs(1,1); while (q--){ int r1,r2,ans=0; cin>>r1>>r2; if (!big[r1] && !big[r2]){ 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[r1][id[r2]]<<endl; }else{ for (int x: st[r2]) ans += DP[id[r1]][x]; cout<<ans<<endl; } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...