Pagini recente » Cod sursa (job #1103462) | Cod sursa (job #2513682) | Cod sursa (job #2093429) | Cod sursa (job #2399459) | Cod sursa (job #325248)
Cod sursa(job #325248)
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;
bool viz[MAX_N];
inline bool cmp(int a, int b)
{
return Sum[a] > Sum[b];
}
void DFS(int x)
{
vector<int>F;
if(viz[x]) return;
viz[x] = 1;
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];
F.push_back(y);
table[x] += table[y];
}
if(F.empty()) return;
sort(F.begin(),F.end(),cmp);
i = 0;
while(Sum[x] > S && i<F.size() )
{
++table[x];
Sum[x] -= Sum[F[i]];
++i;
}
F.clear();
}
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;
}