Cod sursa(job #2543948)

Utilizator baltoi.teodorTeodor Baltoi baltoi.teodor Data 11 februarie 2020 17:39:51
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <bits/stdc++.h>
#define ff first
#define ss second
#define NMAX 100005
#define pb push_back
using namespace std;
const string file = "cerere";

ifstream fin (file+".in");
ofstream fout (file+".out");
typedef long long ll;
typedef long double ld;

const ll INF = 9223372036854775807ll;
const int dx[] = {1, -1, 0, 0}, dy[] = {0, 0, 1, -1}, inf = 2147483647;
int k[NMAX], N;
vector <int> v[NMAX] ; // arborele
//vector <int> vt[NMAX]; //arbore transpus
int tata[NMAX];
int pd[NMAX]; // cat ia pt fiecare maimuta
int ancestors[NMAX], lg;  // stramosi pana in pct curent
void go(int x)
{
    if(k[x] == 0) pd[x]=0;
    else pd[x] = pd[ancestors[lg-k[x]+1]] +1 ;
    ancestors[++lg] = x;
    for (auto fiu : v[x])
        go(fiu);
    lg -- ;
}
int main()
{
    int x,y,rad;
    fin >> N;
    for(int i=1;i<=N; ++i)
        fin>>k[i] ;
    for (int i=1;i<N; ++i) fin>>x>>y, tata[y]=x, v[x].pb(y);
    for (int i=1;i <= N; ++i )
    {
        pd[i]=inf/2;
        if (tata[i] == 0) pd[i] =0, rad=i;
    }
    go(rad);
    for(int i=1;i<=N;++i)
        fout<<pd[i]<<" ";
    return 0;
}