제출 #514968

#제출 시각아이디문제언어결과실행 시간메모리
514968CrouchingDragonMagic Tree (CEOI19_magictree)C++17
100 / 100
124 ms37756 KiB
#include <bits/stdc++.h>
using namespace std;
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  int N, M, K;
  cin >> N >> M >> K;
  vector<int> p(N);
  for (int u = 1; u < N; ++u) {
    cin >> p[u];
    --p[u];
  }
  vector<int> d(N), w(N);
  for (int j = 0; j < M; ++j) {
    int v;
    cin >> v;
    --v;
    cin >> d[v] >> w[v];
  }
  vector<map<int, int64_t>> s(N);
  for (int u = N - 1; u > 0; --u) {
    auto iter = s[u].insert({d[u], 0}).first;
    iter->second += w[u];
    ++iter;
    int64_t sum = -w[u];
    while (iter != s[u].end() && iter->second + sum < 0) {
      sum += iter->second;
      iter = s[u].erase(iter);
    }
    if (iter != s[u].end()) {
      iter->second += sum;
    }
    int v = p[u];
    if (s[v].size() < s[u].size()) {
      swap(s[v], s[u]);
    }
    for (auto [d, w] : s[u]) {
      s[v][d] += w;
    }
  }
  int64_t sum = 0;
  for (auto [d, w] : s[0]) {
    sum += w;
  }
  cout << sum << '\n';
  exit(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...