Cod sursa(job #2218307)

Utilizator HyperLucarioTudor Mihnea HyperLucario Data 4 iulie 2018 11:06:59
Problema Cerere Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

//ifstream fin("omegalul.in");
//ofstream fout("omegalul.out");

ifstream fin("cerere.in");
ofstream fout("cerere.out");

const long N = 100001; //INF = 2e9;

int n;

vector <int> a[N], asc;
int d[N];

void cit()
{
    asc.push_back(0);

    fin>>n;

    for (int i=1; i<=n; i++)
    {
        int k;
        fin>>k;

        asc.push_back(k);
    }

    for (int i=1; i<n; i++)
    {
        int x, y;
        fin>>x>>y;

        a[y].push_back(x);
    }
}

void dfs(int x, int up)
{
    d[x] = 1;

    int curasc = x, y;

    while (up)
    {

        y = a[curasc][0];

        if (y != 1) curasc = y;

        //cout<<x<<" "<<up<<" "<<y<<" "<<curasc<<"\n";

        up--;
    }

    d[x] += d[y];

    return;
}

int main()
{
    cit();

    d[1] = 0;

    fout<<"0 ";

    for (int i=2; i<=n; i++)
    {
        //cout<<i<<" / "<<n<<" "<<asc[i]<<" asc\n";

        if (asc[i] == 0) d[i] = 0;
        else dfs(i, asc[i]);

        fout<<d[i]<<" ";
    }

    return 0;
}