Cod sursa(job #253326)

Utilizator 630r63Ilinca George Mihai 630r63 Data 5 februarie 2009 17:53:52
Problema Mese Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
 #include <cstdio>  
 #include <vector>  
 #include <algorithm>  
   
 using namespace std;  
   
 #define sz size()  
 #define pb push_back  
 #define all(v) v.begin(), v.end()  
 #define x first  
 #define y second  
   
 #define Nmax 100005  
   
 int n, s, rad, rez;  
 int sum[Nmax];  
 pair< int, int > v[Nmax];  
 vector<int> vec[Nmax];  
 vector<int> aux;  
   
 void readdata()  
 {  
     freopen("mese.in", "r", stdin);  
     freopen("mese.out", "w", stdout);  
       
     int i, v1, v2;  
       
     scanf("%d %d", &n, &s);  
     for (i = 1; i <= n; ++i)  
     {  
         scanf("%d %d", &v1, &sum[i]);;  
         if (v1 == 0) rad = i;  
         else vec[v1].pb(i);  
     }  
 }  
   
 void df(int k)  
 {  
     int i, cur;  
       
     for (i = 0; i < vec[k].sz; ++i)  
         df(vec[k][i]);  
     aux.clear();  
     for (i = 0; i < vec[k].sz; ++i)  
     {  
         v[k].y += v[ vec[k][i] ].y;  
         aux.pb(v[ vec[k][i] ].x);  
     }  
     sort(all(aux));  
     cur = sum[k];  
     for (i = 0; i < aux.sz; ++i)  
     {  
         cur += aux[i];  
         if (cur > s)  
         {  
             cur -= aux[i];  
             v[k].y += aux.sz-i;  
             v[k].x = cur;  
             return;  
         }  
     }  
     v[k].x = cur;  
 }  
   
 int main()  
 {  
     readdata();  
     df(rad);  
     printf("%d\n", v[rad].y+1);  
     return 0;  
}