Cod sursa(job #3351166)

Utilizator CalinPaun29Paun Calin CalinPaun29 Data 17 aprilie 2026 12:52:36
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <bits/stdc++.h>
#define int long long
using namespace std;

const int nm=1e5+5;

vector<vector<int>> adj;

int v[nm], v2[nm], pr[nm], f[nm], ver[nm];
int pz=0;

void dfs(int x)
{
    pr[x]=v2[pz-v[x]];

    if(adj[x].size()==0)
        return;

    for(int y:adj[x])
    {
        v2[++pz]=y;
        dfs(y);
        pz--;
    }
}

signed main()
{
    ifstream cin("cerere.in");
    ofstream cout("cerere.out");
    int n, rt, a, b;
    cin>>n;
    adj.resize(n+1);
    for(int i=1; i<=n; i++)
        cin>>v[i];
    for(int i=1; i<n; i++)
    {
        cin>>a>>b;
        adj[a].push_back(b);
        f[b]++;
    }

    for(int i=1; i<=n; i++)
    {
        if(f[i]==0)
        {
            rt=i;
            break;
        }
    }

    v2[++pz]=rt;
    dfs(rt);

    for(int i=1; i<=n; i++)
    {
        if(ver[i]==0)
        {
            int x=i, rez=0, y;
            while(pr[x]!=x)
            {
                x=pr[x];
                rez++;
                if(ver[x]!=0)
                {
                    rez+=ver[x];
                    break;
                }
            }

            ver[i]=rez;
            cout<<rez<<" ";
        }
        else
            cout<<ver[i]<<" ";
    }

    return 0;
}