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...