Submission #1300742

#TimeUsernameProblemLanguageResultExecution timeMemory
1300742tolgaRegions (IOI09_regions)C++20
2 / 100
3253 ms20600 KiB
#include <bits/stdc++.h> using namespace std; const int maxn = 5 + 2e5; vector<int> edges[maxn]; int vert[maxn], tin[maxn], tout[maxn], timer = 0; void dfs(int u) { tin[u] = ++timer; for (int v : edges[u]) dfs(v); tout[u] = timer; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr), cout.tie(nullptr); int n, r, q; cin >> n >> r >> q; vector<vector<int>> reg(r + 5); cin >> vert[1]; reg[vert[1]].push_back(1); for (int i = 2; i <= n; i++) { int par; cin >> par; edges[par].push_back(i); cin >> vert[i]; reg[vert[i]].push_back(i); } dfs(1); for (int i = 1; i <= r; i++) sort(reg[i].begin(), reg[i].end(), [](int &a, int &b) { return tin[a] < tin[b]; }); while (q--) { int r1, r2; cin >> r1 >> r2; auto &v1 = reg[r1], &v2 = reg[r2]; int ans = 0; static auto cmp1 = [](int a, int b) { return tin[a] < tin[b]; }; static auto cmp2 = [](int a, int b) { return tout[a] < tout[b]; }; for (int &u : v1) { if (v2.back() < tin[u] || v2.back() > tout[u]) continue; int left = lower_bound(v2.begin(), v2.end(), tin[u], cmp1) - v2.begin(); int right = upper_bound(v2.begin(), v2.end(), tout[u], cmp2) - v2.begin(); ans += right - left; } cout << ans << endl; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...