제출 #873048

#제출 시각아이디문제언어결과실행 시간메모리
873048NeroZeinMagic Tree (CEOI19_magictree)C++17
100 / 100
109 ms34576 KiB
#include "bits/stdc++.h"
using namespace std;

#ifdef Nero
#include "Deb.h"
#else
#define deb(...)
#endif

const int N = 1e5 + 5;

vector<int> g[N]; 
pair<int, int> a[N]; 
map<int, long long> dp[N]; 

void merge(map<int, long long>& du, map<int, long long>& dv) {
  if (du.size() > dv.size()) {
    swap(du, dv);
  }
  for (auto it : du) {
    dv[it.first] += it.second; 
  }
}

void dfs(int v) {
  for (int u : g[v]) {
    dfs(u); 
    merge(dp[u], dp[v]); 
  }
  if (!a[v].first) return;
  long long tmp = a[v].second; 
  dp[v][a[v].first] += a[v].second; 
  auto it = dp[v].upper_bound(a[v].first);
  while (tmp && it != dp[v].end()) {
    if (tmp >= it->second) {
      tmp -= it->second;
      it = dp[v].erase(it); 
    } else {
      it->second -= tmp; 
      tmp = 0;
    }
  } 
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  int n, m, k;
  cin >> n >> m >> k; 
  for (int i = 2; i <= n; ++i) {
    int p;
    cin >> p;
    g[p].push_back(i); 
  }
  for (int i = 0; i < m; ++i) {
    int v, t, w;
    cin >> v >> t >> w;
    a[v] = {t, w}; 
  }
  dfs(1);
  long long ans = 0; 
  for (auto it : dp[1]) {
    ans += it.second;
  }
  cout << ans << '\n'; 
  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...