Cod sursa(job #2778934)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 2 octombrie 2021 13:25:55
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.85 kb
#include<bits/stdc++.h>
#define P push_back
#define L 1000000
#define X ((++o==L )?f.read(B,L),o=0:0)
using namespace std;
const int M=100005;
ifstream f("cerere.in");
ofstream g("cerere.out");
vector<int> G[M];
int N,d[M],s[M],r,D[M],S[M],t,o,i,a,b;
char B[L];
inline void R(int &x)
{
    for(x=0;B[o]<'0'||B[o]>'9';X);
    for(;B[o]>='0'&&B[o]<='9';X)
        x=x*10+B[o]-'0';
}
inline void F(int k)
{
    S[++t]=k;
    if(s[k])
        D[k]=D[S[t-s[k]]]+1;
    for(vector<int>::iterator j=G[k].begin();j!=G[k].end();++j)
        F(*j);
    --t;
}
int main()
{
    R(N);
    for(i=1;i<=N;++i)
        R(s[i]);
    for(i=1;i<N;++i)
        R(a),R(b),G[a].P(b),d[b]=a;
    for(i=1;i<=N;++i)
        if(!d[i]) {
            r=i;
            break;
        }
    F(r);
    for(i=1;i<=N;++i)
        g<<D[i]<<" ";
    return 0;
}