Submission #1248042

#TimeUsernameProblemLanguageResultExecution timeMemory
1248042lucaskojimaRegions (IOI09_regions)C++17
100 / 100
2737 ms28524 KiB
#include "bits/stdc++.h" #define sz(x) (int)size(x) #define all(x) begin(x), end(x) #define rall(x) rbegin(x), rend(x) using namespace std; using ll = long long; using pii = pair<int, int>; const char nl = '\n'; const int INF = 0x3f3f3f3f; const ll LINF = 0x3f3f3f3f3f3f3f3f; int32_t main() { ios::sync_with_stdio(0), cin.tie(0); int n, r, q; cin >> n >> r >> q; vector<vector<int>> adj(n + 1); vector<int> reg(n + 1); cin >> reg[1]; for (int i = 2; i <= n; i++) { int p; cin >> p; adj[p].push_back(i); cin >> reg[i]; } vector<vector<int>> comp(r + 1); vector<int> tin(n + 1), tout(n + 1), tin_node(n + 1); int t = 0; auto euler = [&](auto euler, int x) -> void { tin[x] = ++t; tin_node[tin[x]] = x; comp[reg[x]].push_back(tin[x]); for (int k : adj[x]) euler(euler, k); tout[x] = t; }; euler(euler, 1); const int SQ = sqrt(n); vector<vector<int>> calc; vector<int> reg_id(r + 1, -1); auto dfs = [&](auto dfs, int x, int k, int cnt) -> void { if (reg[x] == k) cnt++; calc[reg_id[k]][reg[x]] += cnt; for (int v : adj[x]) dfs(dfs, v, k, cnt); }; int cur = 0; for (int i = 1; i <= r; i++) if (sz(comp[i]) > SQ) { reg_id[i] = cur++; calc.push_back(vector<int>(r + 1)); dfs(dfs, 1, i, 0); } while (q--) { int a, b; cin >> a >> b; if (sz(comp[a]) > SQ) { cout << calc[reg_id[a]][b] << endl; } else { int ans = 0; for (int x : comp[a]) { x = tin_node[x]; ans += upper_bound(all(comp[b]), tout[x]) - lower_bound(all(comp[b]), tin[x]); } cout << ans << endl; } } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...