Pagini recente » Cod sursa (job #2470715) | Cod sursa (job #2984988) | Cod sursa (job #590476) | Borderou de evaluare (job #2510111) | Cod sursa (job #768691)
Cod sursa(job #768691)
#include <fstream>
#include <vector>
#define MOD 13107337
#define N 1000010
using namespace std;
ifstream f("arbore3.in");
ofstream g("arbore3.out");
int n,S,i,j,a,b,ANS=0,V[N];
vector<int> A[N],H[MOD];
void Find (int x)
{
vector<int>:: iterator it;
int l=x%MOD;
if (l<0) l+=MOD;
for (it=H[l].begin();it!=H[l].end();it++)
if (*it==x)
ANS++;
return;
}
void Insert (int x)
{
int l=x%MOD;
if (l<0) l+=MOD;
H[l].push_back(x);
}
void Erase (int x)
{
vector<int>:: iterator it;
int l=x%MOD;
if (l<0) l+=MOD;
for (it=H[l].begin();it!=H[l].end();it++)
if (*it==x)
{
H[l].erase(it);
return;
}
}
void DF (int nod, int s)
{
s+=V[nod];
Find(s-S);
Insert(s);
for (unsigned int i=0;i<A[nod].size();i++)
DF(A[nod][i],s);
Erase(s);
}
int main ()
{
f >> n >> S;
Insert(0);
for (i=1;i<=n;i++)
{
f >> a >> V[i];
A[a].push_back(i);
}
DF(1,0);
g << ANS << '\n';
f.close();g.close();
return 0;
}