Pagini recente » Cod sursa (job #1821759) | Cod sursa (job #1223070) | Cod sursa (job #1325633) | Cod sursa (job #2344305) | Cod sursa (job #1806415)
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#define N 1000100
#define MOD 100003
using namespace std;
int s[N];
int snod[N];
vector <int> muc[N];
vector <int> has[MOD];
int nrsol,scaut,sum;
int rest( int k){
if(k>=0){
return k % MOD;
}
return MOD - abs(k) % MOD;
}
void dfs(int k){
vector <int>::iterator it;
has[ rest(snod[k]) ].push_back(k);
for( it = muc[k].begin() ; it !=muc[k].end() ; it++ ){
snod[*it] = snod[k]+ s[*it];
dfs(*it);
}
scaut = snod[k] - sum;
for( it = has[ rest(scaut) ].begin() ; it != has[ rest(scaut) ].end() ; it++ ){
if(scaut == snod [ *it ] ){
nrsol++;
}
}
for( it = has[ rest(snod[k]) ].begin() ; it != has[ rest(snod[k]) ].end() ; it++ ){
scaut = *it;
if ( *it == k){
has[ rest(snod[k]) ].erase(it);
break;
}
}
}
int main(){
int i,n,x,val;
freopen("arbore3.in","r",stdin);
freopen("arbore3.out","w",stdout);
scanf("%d%d",&n,&sum);
for(i=1 ; i<=n ; i++){
scanf("%d%d",&x,&val);
s[i]=val;
//tat[i]=x;
muc[x].push_back(i);
}
has[0].push_back(0);
snod[1]=s[1];
dfs(1);
printf("%d",nrsol);
// printf("%d",-5%MOD);
return 0;
}