Submission #651488

#TimeUsernameProblemLanguageResultExecution timeMemory
651488tanprodiumRegions (IOI09_regions)C++14
95 / 100
8068 ms50452 KiB
#include<bits/stdc++.h> using namespace std; using pii = pair<int, int>; struct Queries { int r1, r2; Queries() {} Queries(int _r1, int _r2): r1(_r1), r2(_r2) {} }; const int N = 2e5 + 5; const int R = 25 * 1e3 + 5; Queries qr[N]; vector<int> id[R], reg[R], adj[N], e[R]; map<pii, int> save; map<pii, bool> exist; int l[N], r[N]; int cnt; void dfs(int fa, int u) { l[u] = ++cnt; for (int v : adj[u]) if (v != fa) dfs(u, v); r[u] = cnt; } void solve() { int n, regs, q; cin >> n >> regs >> q; int x; cin >> x; reg[x].push_back(1); for (int i = 2; i <= n; i++) { int p; cin >> p; adj[i].push_back(p); adj[p].push_back(i); int h; cin >> h; reg[h].push_back(i); } cnt = 0; dfs(0, 1); for (int i = 1; i <= regs; i++) { for (int x : reg[i]) { e[i].push_back(l[x]); } } for (int i = 1; i <= regs; i++) sort(e[i].begin(), e[i].end()); for (int i = 1; i <= q; i++) { int r1, r2; cin >> r1 >> r2; if (exist[{r1, r2}]) { cout << save[{r1, r2}] << endl; fflush(stdout); } else { int ans = 0; for (int x : reg[r1]) { int u = lower_bound(e[r2].begin(), e[r2].end(), l[x]) - e[r2].begin(); int v = upper_bound(e[r2].begin(), e[r2].end(), r[x]) - e[r2].begin(); ans += 1ll * (v - u); } exist[{r1, r2}] = true; save[{r1, r2}] = ans; cout << ans << endl; fflush(stdout); } } } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); solve(); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...