Cod sursa(job #732676)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 10 aprilie 2012 19:41:30
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <fstream>
#include <cstdio>
#include <vector>

#define NMax 100005
#define Buff 7000001

using namespace std;
int N, R, S[NMax], K[NMax], F[NMax], Stack[NMax], BuffI;
vector <int> G[NMax];
char Buffer[Buff];

inline int ReadX()
{
    int X=0;
    while(!(Buffer[BuffI]>='0' && Buffer[BuffI]<='9'))
    {
        ++BuffI;
    }
    while(Buffer[BuffI]>='0' && Buffer[BuffI]<='9')
    {
        X=X*10+Buffer[BuffI]-'0';
        ++BuffI;
    }
    return X;
}

void Read ()
{
    freopen ("cerere.in", "r", stdin);
    fread (Buffer, 1, Buff, stdin);
    N=ReadX ();
    for (int i=1; i<=N; ++i)
    {
        K[i]=ReadX ();
    }
    R=N*(N+1)/2;
    for (int i=1; i<N; ++i)
    {
        int X, Y;
        X=ReadX ();
        Y=ReadX ();
        G[X].push_back (Y);
        F[Y]=X;
        R-=Y;
    }
}

void DFS (int X, int L)
{
    if (K[X]==0)
    {
        S[X]=0;
    }
    else
    {
        S[X]=1+S[Stack[L-K[X]]];
    }
    Stack[L]=X;
    for (unsigned i=0; i<G[X].size (); ++i)
    {
        int V=G[X][i];
        DFS (V, L+1);
    }
}

void Print ()
{
    ofstream fout ("cerere.out");
    for (int i=1; i<=N; ++i)
    {
        fout << S[i] << " ";
    }
    fout << "\n";
    fout.close ();
}

int main()
{
    Read ();
    DFS (R, 1);
    Print ();
    return 0;
}