Cod sursa(job #2218312)

Utilizator HyperLucarioTudor Mihnea HyperLucario Data 4 iulie 2018 11:18:22
Problema Cerere Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 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)
{
    if (up == 0) d[x] = 0;

    else
    {

        d[x] = 1;

        int y, curasc = x;

        while (up)
        {
            y = a[curasc][0];

            if (y != 1) curasc = y;

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

            up--;
        }

        if (d[y]) d[x] += d[y];
        else
        {
            dfs(y, asc[y]);

            d[x] += d[y];
        }

    }
}

int main()
{
    cit();

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

        if (!d[i]) dfs(i, asc[i]);
    }

    for (int i=1; i<=n; i++)
        fout<<d[i]<<" ";

    return 0;
}