Cod sursa(job #2652341)

Utilizator felix24mihaiPrava Felix Mihai felix24mihai Data 24 septembrie 2020 18:55:35
Problema Cerere Scor 25
Compilator cpp-32 Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <iostream>
#include <fstream>
#include <vector>
#define NMAX 100003
using namespace std;
ifstream f("cerere.in");
ofstream g("cerere.out");
int n, ancestorsLvl[NMAX], father[NMAX], answer[NMAX], head;
vector <int> nodes[NMAX];
vector <int> answersLvL[NMAX];
void read(){
    int a,b;
    f >> n;
    long long s = n * (n+1) / 2;
    for (int i = 0; i < n; i++){
        f >> ancestorsLvl[i+1];
    }
    for (int i = 1; i < n; i++){
        f >> a >> b;
        s -= b;
        father[b] = a;
        nodes[a].push_back(b);
    }
    head = s;
}
void DFS(int node){
    int lvl = ancestorsLvl[node];
    int father_ = father[node];
    if (lvl == 0){
        answer[node] = 0;
        answersLvL[node].push_back(0);
        for (int i = 0; i < answersLvL[father_].size(); i++)
            answersLvL[node].push_back(answersLvL[father_][i]);
    }
    else{
        answer[node] = 1 + answersLvL[father_][lvl-1];
        answersLvL[node].push_back(answer[node]);
        for (int i = 0; i < answersLvL[father_].size(); i++)
            answersLvL[node].push_back(answersLvL[father_][i]);
    }
    for (int i = 0; i < nodes[node].size(); i++)
        DFS(nodes[node][i]);
}
int main()
{
    read();
    answer[head] = 0;
    answersLvL[head].push_back(0);
    for (int i = 0; i < nodes[head].size(); i++)
        DFS(nodes[head][i]);
    for (int i = 1; i <= n; i++)
        g << answer[i] << " ";
    return 0;
}