#include <wchar.h>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define V vector
#define pb push_back
#define all(v) v.begin(),v.end()
const long long MOD=1e9+7;
#define P pair
void file() {
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
}
V<int>adj[(int)1e5+1];
int d[(int)1e5+1];
ll v[(int)1e5+1];
int dep[(int)1e5+1];
int l[(int)1e5+1],r[(int)1e5+1];
ll dp[(int)1e5+1];
struct segtree {
private:
struct node {
ll val;
};
node neutral={0LL};
node single( ll v) {
return {v};
}
node merge(node a,node b) {
return {max(a.val,b.val)};
}
public:
int size;
V<node>query;
void init(int n) {
size=1;
while (size<n)size*=2;
query.assign(2*size,neutral);
}
void set(int i,ll v,int x,int lx,int rx) {
if (rx-lx==1) {
query[x]=single(v);
return;
}
int m=(lx+rx)/2;
if (i<m) {
set(i,v,2*x+1,lx,m);
}
else
set(i,v,2*x+2,m,rx);
query[x]=merge(query[2*x+1],query[2*x+2]);
}
void set(int i,int v) {
set(i,v,0,0,size);
}
node calc(int l,int r,int x,int lx,int rx) {
if (lx>=r || rx<=l) {
return neutral;
}
if (l<=lx && rx<=r) {
return query[x];
}
int m=(lx+rx)/2;
node a=calc(l,r,2*x+1,lx,m);
node b=calc(l,r,2*x+2,m,rx);
return merge(a,b);
}
ll calc(int l,int r) {
return calc(l,r,0,0,size).val;
}
};
int cnt=0;
void dfs(int n,int p) {
l[n]=cnt;
for (auto u:adj[n]) {
if (u==p)continue;
cnt++;
dep[u]=dep[n]+1;
dfs(u,n);
}
r[n]=cnt;
}
bool cus(int a,int b) {
bool f1=(l[a]>=l[b] && l[a]<=r[b]);
bool f2=(l[b]>=l[a] && l[b]<=r[a]);
if (f2)return true;
if (f1)return false;
return d[a]>d[b];
}
void solve() {
int n,m,k;
cin>>n>>m>>k;
for (int i=2;i<=n;i++) {
int a;
cin>>a;
adj[a].pb(i);
adj[i].pb(a);
}
for (int i=1;i<=n;i++) {
d[i]=k+1;
}
for (int i=0;i<m;i++) {
int u,day;
ll w;
cin>>u>>day>>w;
d[u]=day;
v[u]=w;
}
int a[n];
for (int i=0;i<n;i++) {
a[i]=i+1;
}
dfs(1,-1);
sort(a,a+n,cus);
ll ans=0;
for (int i=0;i<=k;i++) {
dp[i]=0;
}
segtree tree;
tree.init(k+1);
for (auto u:a) {
if (d[u]>k)continue;
ll x=tree.calc(d[u],k+1)+v[u];
ans=max(ans,x);
if (x>dp[d[u]]) {
dp[d[u]]=x;
tree.set(d[u],x);
}
}
cout<<ans<<endl;
}
int main(){
//file();
solve();
}
컴파일 시 표준 에러 (stderr) 메시지
magictree.cpp: In function 'void file()':
magictree.cpp:11:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
11 | freopen("input.txt","r",stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
magictree.cpp:12:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
12 | freopen("output.txt","w",stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |