Submission #1086539

#TimeUsernameProblemLanguageResultExecution timeMemory
1086539juicyMagic Tree (CEOI19_magictree)C++17
100 / 100
115 ms37308 KiB
#include <bits/stdc++.h>

using namespace std;

#ifdef LOCAL
#include "debug.h"
#else
#define debug(...) 42
#endif

const int N = 1e5 + 5;

int n, m, k;
int a[N], c[N];
vector<int> g[N];
map<int, long long> mp[N];

void dfs(int u) {
  for (auto v : g[u]) {
    dfs(v);
    if (mp[u].size() < mp[v].size()) {
      mp[u].swap(mp[v]);
    }
    for (auto [x, y] : mp[v]) {
      mp[u][x] += y;
    }
  }
  mp[u][a[u]] += c[u];
  for (auto it = mp[u].upper_bound(a[u]); it != mp[u].end(); it = mp[u].erase(it)) {
    auto &cnt = (*it).second;
    long long k = min(cnt, (long long) c[u]);
    c[u] -= k;
    cnt -= k;
    if (cnt) {
      break;
    }
  }
}

int main() {
  ios::sync_with_stdio(false); cin.tie(nullptr);

  cin >> n >> m >> k;
  for (int i = 2; i <= n; ++i) {
    int p; cin >> p;
    g[p].push_back(i);
  }
  while (m--) {
    int v, d, w; cin >> v >> d >> w;
    tie(a[v], c[v]) = tie(d, w);
  }
  dfs(1);
  long long res = 0;
  for (auto x : mp[1]) {
    res += x.second;
  }
  cout << res;
  return 0;
}
#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...