Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- typedef long long ll;
- using namespace std;
- ll arr[200005];
- ll depth[200005];
- int fin[200005];
- ll wt[200005];
- std::vector< pair<ll,int> >::iterator high;
- bool cmp(int val, pair<ll,int> p1){
- return val<p1.first;
- }
- void dfs1(vector<vector<int > > g, int v, int d, std::vector<pair<ll,int> > ls){
- depth[v]=d;
- if(g[v].size()==0){
- high=upper_bound(ls.begin(),ls.end(),depth[v]-arr[v]-1,cmp);
- int i=high-ls.begin();
- for(;i<ls.size();i++)
- fin[ls[i].second]++;
- return ;
- }
- ls.push_back(make_pair(d,v));
- for(int i=0;i<g[v].size();i++){
- dfs1(g,g[v][i],d+wt[g[v][i]],ls);
- }
- ls.pop_back();
- high=upper_bound(ls.begin(),ls.end(),depth[v]-arr[v]-1,cmp);
- int i=high-ls.begin();
- for(;i<ls.size();i++)
- fin[ls[i].second]++;
- return ;
- }
- int main(){
- ios::sync_with_stdio(false);
- memset(fin,0,sizeof(fin));
- int n;
- cin>>n;
- for(int i=0;i<n;i++)
- cin>>arr[i];
- std::vector< std::vector<int> > g(n);
- for(int i=1;i<n;i++){
- int p;
- ll w;
- cin>>p>>w;
- p--;
- g[p].push_back(i);
- wt[i]=w;
- }
- std::vector<pair<ll,int> > ls;
- dfs1(g,0,0,ls);
- for(int i=0;i<n;i++)
- cout<<fin[i]<<" ";
- }
Add Comment
Please, Sign In to add comment