Pagini recente » Cod sursa (job #2816128) | Cod sursa (job #1666819) | Cod sursa (job #90890) | Monitorul de evaluare | Cod sursa (job #2168259)
#include <bits/stdc++.h>
#define INFILE "cerere.in"
#define OUTFILE "cerere.out"
#define RADACINA_FICTIVA -1
using namespace std;
ifstream in(INFILE);
ofstream out(OUTFILE);
const int NMAX=100010;
array<int,NMAX> parent;
array<int,NMAX> numScrisori;
int N;
struct Arbore{
vector<vector<int>> Adj;
void init(int n){
Adj.resize(n+1);
}
void Add(int x, int y){
Adj[x].push_back(y);
Adj[y].push_back(x);
}
}A;
void Read(){
in>>N;
A.init(N);
for(int i=1;i<=N;i++){
in>>parent[i];
}
for(int i=1;i<=N-1;i++){
int x,y;
in>>x>>y;
A.Add(x,y);
}
}
void DFS(int x, int tx, vector<int>&drum){
drum.push_back(x);
if(parent[x]==0){
numScrisori[x]=0;
}
else{
numScrisori[x]=numScrisori[drum[drum.size()-1-parent[x]]]+1;
}
for(auto y:A.Adj[x]){
if(y==tx) continue;
DFS(y,x,drum);
}
drum.pop_back();
}
void Determinare(){
vector<int> drum;
DFS(1,RADACINA_FICTIVA,drum);
for(int i=1;i<=N;i++){
out<<numScrisori[i]<<" ";
}
}
int main(){
Read();
Determinare();
}