Cod sursa(job #1147964)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 20 martie 2014 12:19:43
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
#include <fstream>

#define pb push_back
#define Lim 1000000
#define Next ((++pos==Lim )? f.read(Buffer,Lim) ,pos = 0: 0)

using namespace std;
const int Nmax = 100005;

ifstream f("cerere.in");

vector<int> G[ Nmax ];
int N,daddy[ Nmax ],stra[ Nmax ],root,D[ Nmax ];
int S[ Nmax ],top;

char Buffer[Lim];
int pos;

inline void Read(int &x)
{
    x = 0;
    for(;Buffer[pos] < '0' || Buffer[pos] > '9'; Next);
    for(;Buffer[pos] >= '0' && Buffer[pos] <= '9'; Next)
        x = x*10+Buffer[pos]-'0';
}



inline void read()
{
    Read(N);
    int i,a,b;
    for(i = 1 ; i <= N; ++i)
            Read(stra[ i ]);

    for(i = 1 ; i < N; ++i){
        Read(a);Read(b);
        G[a].pb(b);
        daddy[b] = a;
    }
    for(i = 1; i <= N; ++i)
        if(!daddy[i]) {
            root = i;
            break;
        }
}

inline void DFS(int k)
{
    S[++top] = k;
    if(stra[k]) // vecinu'cautat se afla cu stra[k] mai putine poz in stiva
        D[ k ] = D[ S[ top - stra[k] ] ] +1;
    for(vector<int>::iterator it= G[k].begin();it!=G[k].end();++it)
        DFS(*it);
    -- top;
}

inline void solve()
{
    DFS(root);
    for(int i = 1; i <= N ; ++i)
        printf("%d ",D[i]);
}

int main()
{
    freopen("cerere.in","r",stdin);
    freopen("cerere.out","w",stdout);

    read();
    solve();

    return 0;
}