Cod sursa(job #1806415)

Utilizator CodrutLemeniCodrut Lemeni CodrutLemeni Data 15 noiembrie 2016 12:07:38
Problema Dtcsu Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#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;
}