Submission #1226531

#TimeUsernameProblemLanguageResultExecution timeMemory
1226531jellybeanMagic Tree (CEOI19_magictree)C++20
20 / 100
100 ms26780 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
#define dd(x) cout<<#x<<" is "<<x<<endl;
#define dd2(x,y) cout<<#x<<" is "<<x<<" "<<#y<<" is "<<y<<endl;
#define dl(x) cout<<#x<<" is "<<endl; for(auto i:x) cout<<i<<' '; cout<<endl;
#define fi first
#define se second
typedef pair<int,int> pii;
typedef pair<int,pii> fruit;

const int N = 1e5+5;
vector<int>adj[N];
int st[N], en[N], par[N];

bool cmp(fruit a, fruit b){
	if(a.fi == b.fi) return st[a.se.fi] > st[b.se.fi];
	else return a.fi < b.fi;
}

int cnt = 1;
void dfs(int x, int p){
	st[x] = cnt++;
	for(auto i: adj[x]){
		if(i == p) continue;
		dfs(i,x);
	}
	en[x] = cnt-1;
}

struct node{
	int s,e,m,val=0;
	node *l=nullptr, *r=nullptr;
	
	node(int S, int E){
		s=S,e=E,m=(s+e)/2;
		if(s!=e){
			l=new node(s,m);
			r=new node(m+1,e);
		}
	}
	
	void upd(int x, int v){
		if(s==e) val = v;
		else{
			if(x<=m) l->upd(x,v);
			else r->upd(x,v);
			val = max(l->val,r->val);
		}
	}
	
	int query(int S, int E){
		if(s==S and e==E) return val;
		if(E<=m) return l->query(S,E);
		if(S>m) return r->query(S,E);
		return max(l->query(S,m),r->query(m+1,E));
	}
}*root;

int ans(int x, int p, int f){
	if(f == 1) return root->query(st[x],st[x]);
	
	int res = 0;
	for(auto i:adj[x]){
		if(i == p) continue;
		res += max(ans(i,x,1), ans(i,x,0));
	}
	return res;
}

signed main(){
	ios::sync_with_stdio(0); cin.tie(0);
	
	int n,m,k; cin>>n>>m>>k;
	for(int i=2; i<=n; i++){
		int j; cin>>j;
		adj[i].pb(j);
		adj[j].pb(i);
		par[i] = j;
	}
	
	dfs(1,-1);
	
	fruit fruits[m];
	for(int i=0; i<m; i++){
		int v,d,w; cin>>v>>d>>w;
		fruits[i] = {d,{v,w}};
	}
	
	sort(fruits, fruits+m, cmp);
	//dd(1)
	//for(auto[d,p]:fruits) cout<<d<<" "<<p.fi<<' '<<p.se<<endl;
	
	root = new node(1,n);
	
	int ptr = 0;
	for(int day=1; day<=k; day++){
		while(ptr != n and fruits[ptr].fi == day){
			//dd(day)
			auto[d,p] = fruits[ptr];
			auto[u,w] = p;
			
			int sum = 0;
			for(auto v: adj[u]){
				if(v == par[u]) continue;
				sum += root->query(st[v],en[v]);
			}
			
			root->upd(st[u],sum+w);
			//dd2(st[u],sum+w)
			
			ptr++;
		}
	}
	
	cout<<ans(1,-1,0);
	
	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...