Pagini recente » Cod sursa (job #2671458) | Cod sursa (job #845580) | Cod sursa (job #1126435) | Cod sursa (job #847372) | Cod sursa (job #1004812)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <set>
#include <queue>
#include <deque>
using namespace std;
ifstream f("mese.in");
ofstream g("mese.out");
#define nmax 100005
#define ll long long
#define pb push_back
#define sz size
int n, S, rad;
vector<int> gf[nmax];
int sum[nmax];
int Rez=1;
void citeste(){
f >> n >> S;
for(int i=1; i<=n; ++i){
int x, y; f >> x >> y;
if (x != 0) gf[x].pb(i);
else rad = i;
sum[i] = y;
}
}
void dfs(int nod){
for(int i=0; i<(int)gf[nod].sz(); ++i){
int vc = gf[nod][i];
dfs(vc);
}
vector<int> v;
for(int i=0; i<(int)gf[nod].sz(); ++i){
v.pb( sum[ gf[nod][i] ] );
}
sort(v.begin(), v.end());
int ii = 0;
for(ii=0; ii<(int)v.sz(); ++ii){
if (v[ii] + sum[nod] > S) break;
sum[nod] += v[ii];
} Rez += ( (int)v.sz() - ii );// astia au ramas =>le trebuie o masa
//cout << nod << " " << sum[nod] << " " << ii << " " << v.sz() << "\n";
}
void rezolva(){
// pornesc din frunze si cand ajung intr-un nod unesc fii cei mai mici
dfs(rad);
g << Rez << "\n";
}
int main(){
citeste();
rezolva();
f.close();
g.close();
return 0;
}