Submission #872142

#TimeUsernameProblemLanguageResultExecution timeMemory
872142overwatch9Regions (IOI09_regions)C++17
15 / 100
8096 ms76044 KiB
#include <iostream> #include <vector> #include <unordered_map> using namespace std; struct stree { #define lc v*2 #define rc v*2+1 vector <unordered_map <int, int>> tree; stree (int s) { tree.resize(s * 4); } void pushup(int v) { if (tree[rc].size() < tree[lc].size()) { tree[v] = tree[lc]; for (auto i : tree[rc]) tree[v][i.first] += i.second; } else { tree[v] = tree[rc]; for (auto i : tree[lc]) tree[v][i.first] += i.second; } } void update(int v, int tl, int tr, int p, int val) { if (tl > p || tr < p) return; if (tl == tr) { tree[v][val]++; return; } int tm = (tl + tr) / 2; update(lc, tl, tm, p, val); update(rc, tm+1, tr, p, val); pushup(v); } int query(int v, int tl, int tr, int l, int r, int val) { if (tl > r || tr < l) return 0; if (tl >= l && tr <= r) { if (tree[v].find(val) != tree[v].end()) return tree[v][val]; return 0; } int tm = (tl + tr) / 2; int a = query(lc, tl, tm, l, r, val); int b = query(rc, tm+1, tr, l, r, val); return a + b; } }; const int maxn = 2e5; int visit[maxn], finish[maxn], region[maxn]; vector <int> adj[maxn]; int t = 0; void dfs(int s, int p) { visit[s] = t++; for (auto i : adj[s]) dfs(i, s); finish[s] = t; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n, r, q; cin >> n >> r >> q; vector <vector <int>> cities(r+1); cin >> region[1]; cities[region[1]].push_back(1); for (int i = 2; i <= n; i++) { int x; cin >> x; adj[x].push_back(i); cin >> region[i]; cities[region[i]].push_back(i); } dfs(1, 1); stree tree(t+1); for (int i = 1; i <= n; i++) tree.update(1, 0, t, visit[i], region[i]); while (q--) { int r1, r2; cin >> r1 >> r2; int ans = 0; for (auto i : cities[r1]) { ans += tree.query(1, 0, t, visit[i], finish[i]-1, r2); } cout << ans << endl; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...