Cod sursa(job #3361150)

Utilizator EricDimiCismaru Eric-Dimitrie EricDimi Data 21 iulie 2026 12:12:43
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream f("cerere.in");
ofstream g("cerere.out");

const int MAX_N = 100000;

vector<int> adj[MAX_N + 1];
int sol[MAX_N + 1],
    crt[MAX_N + 1];
int k[MAX_N + 1],
    t[MAX_N + 1];
int n, root;

void Read()
{
    f >> n;
    for(int i = 1; i <= n; i++)
        f >> k[i];
    for(int i = 1; i < n; i++)
    {
        int x, y;
        f >> x >> y;
        adj[x].push_back(y);
        t[y] = x;
    }
}

void GetRoot()
{
    root = 1;
    while(t[root] != 0)
        root++;
}

void DFS(int node, int level)
{
    crt[level] = node;

    if(k[node] == 0)
        sol[node] = 0;
    else
        sol[node] = 1 + sol[crt[level - k[node]]];

    for(int child : adj[node])
        DFS(child, level + 1);
}

void PrintSol()
{
    for(int i = 1; i <= n; i++)
        g << sol[i] << ' ';
    g << '\n';
}

int main()
{
    Read();
    GetRoot();
    DFS(root, 1);
    PrintSol();

    f.close();
    g.close();

    return 0;
}