Pagini recente » Cod sursa (job #1299154) | Cod sursa (job #1747379) | Cod sursa (job #2309425) | Cod sursa (job #1543003) | Cod sursa (job #484954)
Cod sursa(job #484954)
#include <stdio.h>
#include <algorithm>
#include <vector>
#define Nmax 100002
#define pb push_back
using namespace std;
vector< int > v[Nmax];
int Dad[Nmax],Age[Nmax],Niv[Nmax],ind[Nmax];
int N,S;
void dfs(int x){
vector< int >:: iterator it;
Niv[x]=Niv[Dad[x]]+1;
for(it=v[x].begin(); it!=v[x].end(); ++it)
dfs(*it);
}
inline int cmp(int i,int j){
return Niv[i]>Niv[j];
}
inline int cmp2(int i,int j){
return Age[i] < Age[j];
}
int main(){
vector< int >:: iterator it;
int i,sol=0,cati,wh,sp,rad;
freopen("mese.in","r",stdin);
freopen("mese.out","w",stdout);
scanf("%d%d",&N,&S);
for(i=1;i<=N;++i){
scanf("%d%d",&Dad[i],&Age[i]);
if( ! Dad[i] ) rad=i;
else v[Dad[i]].pb(i);
ind[i]=i;
}
dfs(rad);
sort(ind+1,ind+N+1,cmp);
for(i=1; Niv[ind[i]]==Niv[ind[i+1]]; ) ++i; // trec peste frunze
for(++i; i<=N; ++i){
wh=ind[i];
sp=Age[wh]; cati=0;
sort(v[wh].begin(),v[wh].end(),cmp2);
for(it=v[wh].begin(); it!=v[wh].end(); ++it)
if( Age[*it] + sp <= S ) sp += Age[*it], cati++;
else break;
Age[wh]=sp;
sol += v[wh].size()-cati;
}
printf("%d\n",sol+1);
fclose(stdin); fclose(stdout);
return 0;
}