Submission #1239897

#TimeUsernameProblemLanguageResultExecution timeMemory
1239897Double_SlashMagic Tree (CEOI19_magictree)C++20
100 / 100
136 ms31636 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; int n, m, k, d[100001], w[100001], sz; struct Node { ll sum; int lc, rc; } mem[1 << 21]; vector<int> adj[100001]; void upd(int &n, int i, int v, int l, int r) { if (not n) n = ++sz; mem[n].sum += v; if (l == r) return; int m = (l + r) >> 1; if (i <= m) upd(mem[n].lc, i, v, l, m); else upd(mem[n].rc, i, v, m + 1, r); } void erase(int &n, int i, int &v, int l, int r) { if (l > i or not v) return; if (r <= i and mem[n].sum <= v) { v -= mem[n].sum; n = 0; } if (not n) return; if (l == r) { mem[n].sum -= v; v = 0; return; } int m = (l + r) >> 1; erase(mem[n].rc, i, v, m + 1, r); erase(mem[n].lc, i, v, l, m); mem[n].sum = mem[mem[n].lc].sum + mem[mem[n].rc].sum; } int merge(int a, int b) { if (not a or not b) return max(a, b); mem[a].sum += mem[b].sum; mem[a].lc = merge(mem[a].lc, mem[b].lc); mem[a].rc = merge(mem[a].rc, mem[b].rc); return a; } int dfs(int i) { int root = 0; for (int j: adj[i]) root = merge(root, dfs(j)); upd(root, -d[i], w[i], -k, -1); erase(root, -d[i] - 1, w[i], -k, -1); return root; } int main() { cin >> n >> m >> k; for (int i = 2; i <= n; ++i) { int p; cin >> p; adj[p].emplace_back(i); } while (m--) { int v; cin >> v >> d[v] >> w[v]; } cout << mem[dfs(1)].sum; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...