# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1273598 | mkkkkkkkk | Tree (IOI24_tree) | C++20 | 0 ms | 0 KiB |
#include "tree.h"
#include <bits/stdc++.h>
using namespace std;
vector<long long> adj[200001];
long long arr[200001],arr2[200001];
void dfs(long long i,long long& res,long long l,long long r)
{
long long sum=0;
for(auto it : adj[i])
{
dfs(it,res,l,r);
sum+=arr2[it];
}
if(adj[i].size()==0)
{
sum=l;
res+=l*arr[i];
}
if(sum>r)
{
long long br=sum-r;
sum=r;
res+=br*arr[i];
}
arr2[i]=l;
}
void init(std::vector<long long> P, std::vector<long long> W) {
for(long long i=1;i<P.size();i++)
{
adj[P[i]].push_back(i);
arr[i]=W[i];
}
arr[0]=W[0];
}
long long query(long long L, long long R)
{
long long res=0;
dfs(0,res,L,R);
return res;
}