Pagini recente » Cod sursa (job #2718672) | Cod sursa (job #2178912) | Cod sursa (job #2983190) | Cod sursa (job #1853011) | Cod sursa (job #325249)
Cod sursa(job #325249)
using namespace std;
#include<cstdio>
#include<vector>
#include<algorithm>
#define MAX_N 100002
vector<int>G[MAX_N];
int S;
int Sum[MAX_N]; // suma din subarborele lui i
short int A[MAX_N]; // varsta lui i
int table[MAX_N]; // in cate mese am partitionat subarborele lui i
int R,N;
inline bool cmp(int a, int b)
{
return Sum[a] > Sum[b];
}
void DFS(int x)
{
if(Sum[x]) return;
unsigned i; int y;
Sum[x] = A[x];
for(i=0;i<G[x].size();++i)
{
y = G[x][i];
DFS(y);
Sum[x] += Sum[y];
table[x] += table[y];
}
if(G[x].empty()) return;
sort(G[x].begin(),G[x].end(),cmp);
i = 0;
while(Sum[x] > S && i<G[x].size() )
{
++table[x];
Sum[x] -= Sum[G[x][i]];
++i;
}
}
int main()
{
freopen("mese.in","r",stdin);
freopen("mese.out","w",stdout);
scanf("%d%d",&N,&S);
int x,i;
for(i=1;i<=N;++i)
{
scanf("%d%hd",&x,&A[i]);
if(x) G[x].push_back(i);
else R = i;
}
DFS(R);
printf("%d\n",table[R] + 1);
return 0;
}