Cod sursa(job #768691)

Utilizator tzipleatudTudor Tiplea tzipleatud Data 17 iulie 2012 16:48:44
Problema Hashuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#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;
}